Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在多个强类型视图之间保留对象属性值? 我有一个视图模型,名为ExampleViewModel 我有一个名为ExampleController 我有两个视图,分别称为Page1和Page2_C#_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

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。。。尝试隐藏表单值、会话或数据库。