MVC 3将模型从视图传递到控制器,而不使用Html表单(提交)或JSON

时间:2012-12-04 09:19:58

标签: jquery asp.net-mvc-3 session razor view

我有一个Web应用程序的以下场景:

用户注册公司,为此我加载公司创建视图。

在创建页面中,我有一个公司联系人的下拉列表。最初此列表为空,用户可以单击创建按钮以创建新地址。

这会为联系人加载部分视图(作为JQuery弹出窗口)。用户创建新的联系人后,视图将返回到公司注册视图。必须在下拉框中使用新添加的联系人刷新公司注册视图。它还必须保留已输入的任何数据。

以下是与我相同的场景,但由于设计限制,我无法使用JSON。 How to pass the full Model from view to controller via jquery in a MVC c# application

我的问题:有什么方法可以将整个模型存储在Session的视图中,以便在我的控制器中使用?

我尝试了以下内容:

        <div class="editor-label">
            @Html.LabelFor(model => model.CompanyName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CompanyName)
            @Html.ValidationMessageFor(model => model.CompanyName)

            @Session.Add("CompanyName",Model.CompanyName)
        </div>

由于这是无效的,它不会返回值,也无法呈现。

所以我尝试将模型作为参数传递给控制器​​,但它保持为null:

public ActionResult CreateContactPerson(ManagementAgencyViewModel viewModel)
    {

        if(HttpContext.Session != null)
            HttpContext.Session.Add("MaObject",viewModel);

        return RedirectToAction("Create", "ContactPersons");
    }

使用actionLink调用名为“ManagementAgencies”的公司控制器:

    @Html.ActionLink(@ViewResources.Link_New_ContactPerson, "CreateContactPerson",           "ManagementAgencies", null, new { @class = "openDialog  ui-button ui-state-default ui-corner-all", data_dialog_id = "createDialog", data_dialog_title = @ViewResources.DialogTitle_CreateNew })

是否有任何替代方法存储在Session中,没有使用隐藏字段或JSON? 如果是这样,从视图中将模型值存储到会话中的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

请记住,服务器标签在呈现视图时执行。当代码:

@Session.Add("CompanyName",Model.CompanyName)

执行,Model.CompanyName没有值,因为渲染的视图正被发送到用户的Web浏览器。将该位置的代码字面设置为CompanyName的默认值(此时可能为null)。

稍后,用户将表单提交给您的操作,您在CreateContactPerson中定义的viewModel变量将填充用户的值。此时,您可以将值保存到会话中。 只需将会话保存代码模式化为您的操作即可,您应该做得很好。