使用数据注释添加验证

本文关键字:添加 验证 注释 数据 | 更新日期: 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操作。您当前的实现不起作用,因为您首先更新数据库,然后验证输入模型是否正确。接下来是,在模型无效的情况下,您不应重定向,因为您将丢失包含错误(消息)的ModelStateDeleteConfirmed的正确实现将如下所示:

[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
}