如何在多个强类型视图之间保留对象属性值?

时间:2015-04-27 13:43:27

标签: c# asp.net-mvc asp.net-mvc-4 razor

  • 我有一个名为ExampleViewModel的视图模型。
  • 我有一个名为ExampleController
  • 的控制器
  • 我有两个名为Page1Page2的视图。

两个视图都使用ExampleViewModel进行了强类型输入。

ExampleViewModel包含两个属性NameAge

  • 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")
}   

3 个答案:

答案 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")
}

Page2Name做同样的事情:

@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的值。

建议在会话中保存此对象。