【问题标题】:Adding validation with DataAnnotations使用 DataAnnotations 添加验证
【发布时间】:2014-04-08 08:43:08
【问题描述】:

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

对象的实体模型是这样的(它还有很多属性,但我只留下了重要的一个):

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>

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 试过这个,但没用。我认为问题在于“m => m.Reason”指向部分类模型“card”而不是新创建的“DeleteConfirmViewModel”。
【解决方案2】:
[HttpPost]
public ActionResult ControllerName(ModelClassName viewModel)
{
   if (!ModelState.IsValid)
   return View("ViewName", viewModel);//passes validation errors back to the view

   //do w.e
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2010-12-17
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多