使用数据注释添加验证
本文关键字:添加 验证 注释 数据 | 更新日期: 2023-09-27 17:57:12
我有一个从表中删除对象的表单。我想在按下删除按钮之前放置一个文本字段来验证输入。
对象的实体模型如下所示(它有更多的属性,但我只留下了重要的属性):
public partial class card
{
public string reason { get; set; }
}
POST(删除)请求的控制器方法如下所示:
// POST: /card/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
card temp_card = db.cardss.Find(id);
temp_card.deleted = true;
db.SaveChanges();
if (ModelState.IsValid)
return RedirectToAction("Index");
return View(temp_card);
}
我已经阅读过,我必须创建另一个类并使用元数据注释才能工作,因为我使用的是实体模型。所以我写了这个:
[MetadataType(typeof(CardMetaData))]
public partial class card
{
public string reason { get; set; }
}
public class CardMetaData
{
[Required(ErrorMessage = "Write a reason for deletion.")]
public string reason { get; set; }
}
在我的删除中.aspx是以下几行:
<%= Html.ValidationSummary("Delete was unsuccessful.") %>
<div class="display-field">
<%: Html.TextBoxFor(model => model.reason) %>
<%: Html.ValidationMessageFor(model => model.reason) %>
</div>
如果我按下删除按钮并且文本字段为空,这不会显示消息。我错过了什么?
您需要
一个具有Reason
属性的[Required]
属性的视图模型
public class DeleteConfirmViewModel
{
[Required]
public string Reason { get; set; }
}
然后重新制作您的DeleteConfirmed
操作。您当前的实现不起作用,因为您首先更新数据库,然后验证输入模型是否正确。接下来是,在模型无效的情况下,您不应重定向,因为您将丢失包含错误(消息)的ModelState
。DeleteConfirmed
的正确实现将如下所示:
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id, DeleteConfirmViewModel viewModel)
{
if (ModelState.IsValid)
return View(viewModel);
card temp_card = db.cardss.Find(id);
temp_card.deleted = true;
temp_card.reason = viewModel.Reason;
db.SaveChanges();
return View(temp_card);
}
在您看来,如果没有给出原因,您将需要显示验证消息
@Html.ValidationMessageFor(m => m.Reason)
因此,视图中原因字段的工作输入字段设置可能如下所示
@Html.LabelFor(m => m.Reason)
@Html.EditorFor(m => m.Reason)
@Html.ValidationMessageFor(m => m.Reason)
编辑
要渲染DeleteConfirmed
视图,您需要创建一个视图模型并将其传递给视图
[HttpGet, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
return View(new DeleteConfirmViewModel());
}
[HttpPost]
public ActionResult ControllerName(ModelClassName viewModel)
{
if (!ModelState.IsValid)
return View("ViewName", viewModel);//passes validation errors back to the view
//do w.e
}