使用DataAnnotations添加验证

时间:2014-04-08 08:43:09

标签: c# .net asp.net-mvc-4

我有一个用于从表中删除对象的表单。我想在按下“删除”按钮之前放置一个可以验证输入的文本字段。

对象的实体模型看起来像这样(它有更多的属性,但我只留下了重要的属性):

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);
    }

我已经阅读过,我必须创建另一个类并使用MetaDataAnnotations来实现这一点,因为我使用的是实体模型。所以我写了这个:

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

在我的Delete.aspx中有以下几行:

 <%= Html.ValidationSummary("Delete was unsuccessful.") %>
 <div class="display-field">
    <%: Html.TextBoxFor(model => model.reason) %>
    <%: Html.ValidationMessageFor(model => model.reason) %>
 </div>

如果我按下删除按钮并且文本字段为空,则不会显示消息。我错过了什么?

2 个答案:

答案 0 :(得分:1)

您需要[Required]属性Reason属性的视图模型

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());
}

答案 1 :(得分:0)

[HttpPost]
public ActionResult ControllerName(ModelClassName viewModel)
{
   if (!ModelState.IsValid)
   return View("ViewName", viewModel);//passes validation errors back to the view

   //do w.e
}