【问题标题】:How to pass model data across views in MVC?如何在 MVC 中跨视图传递模型数据?
【发布时间】:2011-10-11 17:32:33
【问题描述】:

我正在尝试弄清楚如何跨视图传递模型

这就是我正在做的事情,我有一个 Register、RegisterConfirm、RegisterComplete 视图。

用户从注册开始,填写信息,点击继续并发布到 RegisterConfirm,他们单击复选框以同意隐私政策,然后发布到 RegisterComplete,它会在第一个注册视图中基于模型创建用户。

代码:

[GET("账户/注册")] 公共动作结果寄存器() { 返回视图(); } [POST("账户/注册/确认")] public ActionResult RegisterConfirm(RegisterModel 模型) { 如果(模型状态。IsValid) { 返回视图(模型); } 否则 { 返回视图(“注册”,模型); } } [POST("帐户/注册/完成")] public ActionResult RegisterComplete(RegisterModel 模型, bool 同意) { 如果(同意){ // 创建用户 } 返回视图(“注册”,模型); }

查看表格

登记: @using (Html.BeginForm("RegisterConfirm", "Account", FormMethod.Post, new { @id = "create" })) { 注册确认: @using (Html.BeginForm("RegisterComplete", "Account", FormMethod.Post, new { @id = "create" })) {

问题是,当我到达 RegisterComplete 时,模型值是空的……有什么想法,或者这不可能吗?还是应该这样工作,我需要仔细检查我的注册完成?

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    您的 RegisterConfirm 视图是否使用仅显示元素来显示注册信息?如果是这样,MVC 将无法绑定数据来填充模型。

    您需要将模型呈现为 Input 元素,即使它们是隐藏的,以便模型绑定器可以填充 RegisterModel(您可以将属性呈现为“数据保留”的隐藏元素和显示的输出元素)。

    如果您使用 Input 元素,请检查这些元素的名称是否与 RegisterModel 的属性名称匹配,否则,模型绑定器将无法填充 RegisterModel。

    如果出于某种原因,您不能将数据放入 RegisterConfirm 视图的 Input 元素中,则需要将数据存储在服务器端的某个位置,无论是在 Session State(或 TempData,它仍然使用 Session State ) 或在某个描述的数据库中。

    在服务器端存储模型的优势在于,您可以确保在将数据发送到客户端和接收回数据之间没有被篡改。

    【讨论】:

    • 我在想这是因为我在 RegisterConfirm 中没有数据元素,并且隐藏输入元素是不可行的,因为 RegisterModel 将包含他们创建的密码,但是 TempData 可以工作,只是尝试过正确通过,所以我会使用它...感谢您的建议
    【解决方案2】:

    您可以使用TempData 并将您的模型存储在其中并从中接收您的模型

    [POST("Account/Register/Confirm")]
                public ActionResult RegisterConfirm(RegisterModel model)
                {
                    if (ModelState.IsValid)
                    {
                        //store data for any other request
                        TempData["newUser"]=model;
    
                        return View();
                    }
                    else { return View("Register", model); }
                }
    
            [POST("Account/Register/Complete")]
            public ActionResult RegisterComplete(RegisterModel model, bool agree)
            {
                //retrieve data back irrespective of use choice 
                //to clear memory
    
                RegisterModel newUser= TempData["newUser"];
    
                if (agree) { 
                    // Create User
                    //use newUser
                }
                return View("Register", model);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 2012-12-07
      • 2013-02-15
      • 1970-01-01
      • 2015-01-28
      相关资源
      最近更新 更多