ExampleViewModel
的视图模型。ExampleController
Page1
和Page2
的视图。两个视图都使用ExampleViewModel
进行了强类型输入。
ExampleViewModel
包含两个属性Name
和Age
。
Page1
捕获属性Name
。Page2
捕获属性Age
。当我访问page1
时,我会填写Name
属性的文本框,然后点击“下一步”按钮,该按钮会将数据发布到控制器。
调试时,您可以看到数据已发布好了。发送回post函数的数据是ExampleViewModel
对象。然后我将同一个对象传递给Page2
。
当我访问page2
时,我会填写Age
属性的文本框,然后点击Back
按钮,该按钮会将数据发布到控制器。
此处的问题是,当您查看已回发的ExampleViewModel
对象时,Name
中设置的Page1
属性值现已丢失,且仅{{1}提交数据(Page2
属性)。
如何保留在视图之间传递的同一对象的属性值?
ExampleViewModel
Age
ExampleController
public class ExampleViewModel
{
public string Name { get; set; }
public int Age { get; set; }
}
Page 1查看
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 2查看
@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")
}
答案 0 :(得分:2)
这是因为当您回发Page2时,您不再设置名称,因为它不会在任何地方保留。
持久化的一种方法是,在你的Page2视图中,你还为你的name属性添加一个HiddenField,这样当你将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")
}
答案 1 :(得分:0)
在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")
}
答案 2 :(得分:0)
正确的方法是
我可以想到两种简单的方法。
i)使用向导类的Clientside javascript控件(或Jquery,Angularjs等)和最后提交的回发(步骤) 要么 只需在浏览器上通过javascript显示/隐藏页面的不同部分,然后提交(回发)作为最终步骤。
以下是Link
的示例OR
ii)在每次回发时保存对象。
如果您要保存这些值,我的意思是保存&#39;姓名&#39;在Page1回发,然后在第2页回发你应该只从db检索保存的对象,只需设置&#39; age&#39;到模型并将其保存回db。
仅更新允许用户通过每个回发更新的Model的值。
我不建议在会话中保存此对象。