C# 如何在多个强类型视图之间保留对象属性值? 我有一个视图模型,名为ExampleViewModel 我有一个名为ExampleController 我有两个视图,分别称为Page1和Page2
这两个视图都使用C# 如何在多个强类型视图之间保留对象属性值? 我有一个视图模型,名为ExampleViewModel 我有一个名为ExampleController 我有两个视图,分别称为Page1和Page2,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,这两个视图都使用ExampleViewModel强类型 ExampleViewModel包含两个属性,Name和Age Page1捕获属性的数据Name Page2捕获属性的数据Age 当我访问page1时,我填写Name属性的文本框,然后点击“Next”(下一步)按钮,该按钮将数据发布到控制器 调试时,您可以看到数据已发布OK。发送回post函数的数据是ExampleViewModel对象。然后我将相同的对象传递到Page2 然后,当我访问page2时,我填写Age属性的文本框,并点击Ba
ExampleViewModel
强类型
ExampleViewModel
包含两个属性,Name
和Age
捕获属性的数据Page1
Name
捕获属性的数据Page2
Age
page1
时,我填写Name
属性的文本框,然后点击“Next”(下一步)按钮,该按钮将数据发布到控制器
调试时,您可以看到数据已发布OK。发送回post函数的数据是ExampleViewModel
对象。然后我将相同的对象传递到Page2
然后,当我访问page2
时,我填写Age
属性的文本框,并点击Back
按钮,该按钮将数据发布到控制器
这里的问题是,当您查看回发的ExampleViewModel
对象时,在Page1
中设置的Name
属性值现在丢失,只提交Page2
数据(Age
属性)
如何保持在视图之间传递的同一对象的属性值?
示例视图模型
public class ExampleViewModel
{
public string Name { get; set; }
public int Age { get; set; }
}
示例控制器
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();
}
}
}
第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")
}
@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")
}
@model ExampleProject.ViewModels.ExampleViewModel
@使用(Html.BeginForm(“PostMethod”、“Example”、FormMethod.Post))
{
@Html.Label(“您的姓名”)
@Html.TextBoxFor(m=>m.Name)
@Html.Hidden(“下一页”、“第2页”)
@隐藏(“nextcontroller”,“示例”)
}
第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")
}
@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")
}
@model ExampleProject.ViewModels.ExampleViewModel
@使用(Html.BeginForm(“PostMethod”、“Example”、FormMethod.Post))
{
@Html.Label(“年龄”)
@Html.TextBoxFor(m=>m.Age)
@Html.Hidden(“上一个动作”,“第1页”)
@隐藏(“previouscontroller”,“示例”)
}
这是因为当您回发第2页时,您不再设置名称,因为它不会保留在任何地方
保持这种状态的一种方法是,在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")
}
@model ExampleProject.ViewModels.ExampleViewModel
@使用(Html.BeginForm(“PostMethod”、“Example”、FormMethod.Post))
{
@Html.Label(“年龄”)
@Html.TextBoxFor(m=>m.Age)
@Html.HiddenFor(m=>m.Name)
@Html.Hidden(“上一个动作”,“第1页”)
@隐藏(“previouscontroller”,“示例”)
}
在第1页
中,您应该通过隐藏输入将年龄
的值发送回控制器:
@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")
}
正确的做法是
我可以想出两个简单的方法
i) 使用类似于向导的客户端javascript控件(或Jquery、Angularjs等)并在上次提交时回发(步骤)
或
只需通过javascript在浏览器上显示/隐藏页面的不同部分,并提交(回发)作为最后一步
这里有一个例子
或
ii)在每次回发时保存对象
如果您要保存这些值,我的意思是在第1页回发时保存“Name”,然后在第2页回发时,您应该只从db中检索保存的对象,只需将“age”设置为模型并将其保存回db
仅更新允许用户通过每次回发更新的模型值
我不建议在会话中保存此对象。您的第2页视图不会为
ExampleViewModel
的Name
属性提供输入欢迎使用无状态web。。。尝试隐藏表单值、会话或数据库。