隐藏表单以模型作为参数提交

时间:2016-01-25 16:09:54

标签: javascript jquery asp.net-mvc asp.net-mvc-5

我正在尝试弄清楚如何将MVC Model发送到我的ActionResult方法,但AccountsManagementDetailsModel model上的数据始终为空或{{1即使模型对象本身是正确构造的,只有空属性

我在控制器上的方法

null

我的 JQuery

    public async Task<ActionResult> ResetPassword(AccountsManagementDetailsModel model)
    {
        ...
    }

我的 var form = $('<form action="@Url.Action("ResetPassword", "AccountsManagement")" method="POST">'); var input = $("<input>") .attr("type", "hidden") .attr("name", "model").val(@Html.Raw(Json.Encode(Model))); form.append(input + "</input></form>"); form.appendTo('body').submit();

AccountsManagementDetailsModel

我做错了什么?

1 个答案:

答案 0 :(得分:1)

发送模型的正确方法是为模型的每个属性创建输入。这可能很困难,但您可以使用EditorTemplateHtmlHelpers的帮助下生成html。

我能看到的最简单的方法是改变你的代码:

  var form = $('<form action="@Url.Action("ResetPassword", "AccountsManagement")" method="POST">' + formHtml + "</form>");

var formHtml = '@Html.Raw(Html.EditorForModel().ToString().Replace("\r\n", "<br />"))';

form.append(formHtml  + "</form>");
form.appendTo('body').submit();

Helper EditorForModel应该为您创建有效的输入(具有正确的name属性),并允许您将模型发布到控制器并将其绑定到那里。

无论如何,如果您不想以这种方式更改代码,您可以像这样更改控制器代码:

public async Task<ActionResult> ResetPassword(string model)
{
    AccountsManagementDetailsModel modelBind = new JavaScriptSerializer().Deserialize<AccountsManagementDetailsModel>(model);
}

这一行应该将序列化的string从Json反序列化到您的模型。