使用ViewModel验证失败后保存表单字段

时间:2015-05-19 17:59:00

标签: c# asp.net-mvc viewmodel

我有一个使用ViewModel的C#表单。 Get函数调用这样的视图:

return View(viewmodel);

在我的发布功能中,我验证了表单字段,然后使用它返回视图:

if (!ModelState.IsValid)
{
    ViewData["wo_id"] = wo_id;
    var viewmodel = new AEO.WorkOrder.Domain.ViewModels.WorkOrderDetailsViewModel(wo_id);
    viewmodel.GetWOIMDetails();
    return View(viewmodel);
}

问题是如果表单验证失败,刷新的页面会返回,所有字段都是空白的。如何在刷新时保存这些字段中的信息?

编辑:以下是视图

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<AEO.WorkOrder.Domain.ViewModels.WorkOrderDetailsViewModel>" %>

<%= Html.ValidationSummary() %>
<% Html.BeginForm("InternationalTransportationAddDetails","InternationalMove", FormMethod.Post); %>
<input id="comments" type="text" name="comments"/><%= Html.ValidationMessage("Comments", "*") %>
<input type="submit" value="Submit New Details" id="submit" name="submit" />   <br />
<input type="hidden" value="<%= ViewData["wo_id"] %>" id="wo_id" name="wo_id" />   <br />

2 个答案:

答案 0 :(得分:1)

在您的后期操作中,您将返回viewmodel的新实例,而不是后期模型。它应该是什么样子的例子:

[HttpPost]
public ActionResult InternationalTransportationAddDetails(WorkOrderDetailsViewModel model)
{
  if (!ModelState.IsValid)
  {
    ViewData["wo_id"] = wo_id;  // however you get wo_id

    return View(model);
  }

  // if valid, process model here
}

看看我如何退回发布的模型?现在,如果表单的值与您的viewmodel不匹配,那么您必须创建一个viewmodel的新实例,但还要包含post-model的值作为viewmodel的一部分:

[HttpPost]
public ActionResult InternationalTransportationAddDetails(SomeModel model)
{
  if (!ModelState.IsValid)
  {
    ViewData["wo_id"] = wo_id;
    var viewmodel = new AEO.WorkOrder.Domain.ViewModels.WorkOrderDetailsViewModel(wo_id);
    viewmodel.comments = model.Comments;
    return View(viewmodel);
  }

所以在这个例子中,我们采用了我们的表单模型,如果验证失败,我们将该模型的属性应用回我们的视图模型,然后返回视图模型。       //如果有效,请在此处理模型     }

答案 1 :(得分:1)

您需要使用HtmlHelper方法生成表单输入,以便它们正确地重新显示尝试的值。

Html.TextBoxFor(vm => vm.Comments)

Html.TextBox("Comments")