繁体   English   中英

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

[英]How do I retain object property values between more than one strongly typed view?

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

这两个视图都使用ExampleViewModel进行了强类型化。

ExampleViewModel包含两个属性, NameAge

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

并在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")
}

正确的方法是

我可以想到两种简单的方法。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM