使用 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")
我有一个使用 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")