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

Save Form Fields After Failed Validation With ViewModel

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

return View(viewmodel);

在我的 Post 函数中,我正在验证表单字段,然后将其用于 return 视图:

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 />

在您的 post-action 中,您正在 return 创建视图模型的新实例,而不是 post-模型。它应该是什么样子的例子:

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

看看我是如何 return 编辑 post 模型的?现在,如果您的表单值与您的视图模型不匹配,那么您将必须创建一个新的视图模型实例,但还包括 post-模型的值作为视图模型的一部分:

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

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

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

Html.TextBoxFor(vm => vm.Comments)

Html.TextBox("Comments")