[英]How do I retain object property values between more than one strongly typed view?
ExampleViewModel
视图模型。 ExampleController
控制器 Page1
和Page2
视图。 这两个视图都使用ExampleViewModel
进行了强类型化。
ExampleViewModel
包含两个属性, Name
和Age
。
Page1
捕获属性Name
数据。 Page2
捕获属性Age
数据。 当我访问page1
,我填写Name
属性的文本框,然后单击“ Next”按钮,该按钮会将数据发布到控制器。
调试时,您可以看到数据已发布。 发送回post函数的数据是ExampleViewModel
对象。 然后,我将该对象传递给Page2
。
然后,当我访问page2
,我填写Age
属性的文本框,然后单击Back
按钮,该按钮会将数据发布到控制器。
这里的问题是当您查看回发的ExampleViewModel
对象时,现在丢失了在Page1
中设置的Name
属性值,并且仅提交了Page2
数据( Age
属性)。
如何保留在视图之间传递的同一对象的属性值?
ExampleViewModel
public class ExampleViewModel
{
public string Name { get; set; }
public int Age { get; set; }
}
ExampleController
public class ExampleController : Controller
{
[HttpPost]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult PostMethod (ExampleViewModel formData, FormCollection form, string command)
{
string newView = "";
string newController = "";
Session["formData"] = formData;
if (command.ToLower() == "back")
{
newView = form["PreviousAction"];
newController = form["PreviousController"];
}
else if (command.ToLower() == "next")
{
newView = form["NextAction"];
newController = form["NextController"];
}
return RedirectToAction(newView, newController);
}
public ActionResult Page1()
{
return GetView();
}
public ActionResult Page2()
{
return GetView();
}
private ViewResult GetView()
{
ExampleViewModel formData = (ExampleViewModel)Session["formData"];
if (formData != null)
{
return View(formData);
}
else
{
return View();
}
}
}
Page 1视图
@model ExampleProject.ViewModels.ExampleViewModel
@using (Html.BeginForm("PostMethod", "Example", FormMethod.Post))
{
@Html.Label("Your name")
@Html.TextBoxFor(m => m.Name)
<input id="ButtonNext" type="submit" name="Command" value="Next" />
@Html.Hidden("nextaction", "page2")
@Html.Hidden("nextcontroller", "example")
}
Page 2视图
@model ExampleProject.ViewModels.ExampleViewModel
@using (Html.BeginForm("PostMethod", "Example", FormMethod.Post))
{
@Html.Label("Age")
@Html.TextBoxFor(m => m.Age)
<input id="ButtonBack" type="submit" name="Command" value="Back" />
@Html.Hidden("previousaction", "page1")
@Html.Hidden("previouscontroller", "example")
}
这是因为当您发回Page2时,您不再设置名称,因为它没有保存在任何地方。
保持这种状态的一种方法是,在您的Page2视图中,还为您的name属性添加一个HiddenField,以便在将Page2发回到服务器上时,“名称”字段仍将被绑定。
@model ExampleProject.ViewModels.ExampleViewModel
@using (Html.BeginForm("PostMethod", "Example", FormMethod.Post))
{
@Html.Label("Age")
@Html.TextBoxFor(m => m.Age)
@Html.HiddenFor(m => m.Name)
<input id="ButtonBack" type="submit" name="Command" value="Back" />
@Html.Hidden("previousaction", "page1")
@Html.Hidden("previouscontroller", "example")
}
在Page1
您应该通过隐藏的输入将Age
的值发送回控制器:
@using (Html.BeginForm("PostMethod", "Example", FormMethod.Post))
{
@Html.Label("Your name")
@Html.TextBoxFor(m => m.Name)
@Html.HiddenFor(m => m.Age)
<input id="ButtonNext" type="submit" name="Command" value="Next" />
@Html.Hidden("nextaction", "page2")
@Html.Hidden("nextcontroller", "example")
}
并在Page2
对Name
做同样的事情:
@model ExampleProject.ViewModels.ExampleViewModel
@using (Html.BeginForm("PostMethod", "Example", FormMethod.Post))
{
@Html.Label("Age")
@Html.TextBoxFor(m => m.Age)
@Html.HiddenFor(m => m.Name)
<input id="ButtonBack" type="submit" name="Command" value="Back" />
@Html.Hidden("previousaction", "page1")
@Html.Hidden("previouscontroller", "example")
}
正确的方法是
我可以想到两种简单的方法。
i)使用向导类型的客户端javascript控件(或Jquery,Angularjs等),并在最后一个Submit(Step)上回发,或者仅通过javascript在浏览器上显示/隐藏页面的不同部分,然后Submit(postback)作为最后一步。
这是一个示例链接
要么
ii)在每次回发中保存对象。
如果要保存这些值,我的意思是在Page1回发中保存“名称”,然后在第2页回发中仅应从db检索已保存的对象,并将“ age”设置为Model并将其保存回db。
仅更新允许用户通过每个回发更新的Model的值。
我不建议在会话中保存该对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.