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

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

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

我在 Controller 上的方法:

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

我的JQuery:

    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:

public class AccountsManagementDetailsModel : UserInfo
{
    public bool New { get; set; }
}

public class UserInfo
{
    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [Display(Name = "Username")]
    public string UserName { get; set; }
    [Required]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }
    [Required]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }
    public bool Customer { get; set; }
    public string CustomerID { get; set; }
    public bool MustChangePassword { get; set; }
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd hh:mm}", ApplyFormatInEditMode = true)]
    public DateTime? LastLogin { get; set; }
}

我做错了什么?

最佳答案

发送模型的正确方法是为模型的每个属性创建输入。这可能很困难,但您可以使用 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 属性),并允许您将模型发布到 Controller 并将其绑定(bind)在那里。

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

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

此行应将序列化的字符串从 Json 反序列化为模型。

关于javascript - 以模型作为参数的隐藏表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997094/

相关文章:

jquery - 从输入中获取值,结果为 NaN

c# - ASP.NET Core MVC 混合路由/FromBody 模型绑定(bind)和验证

c# - 自定义字符串作为 Entity Framework 的主键

asp.net-mvc - 如何在 Asp.Net MVC 中发布部分帖子?

javascript - 在不同网站语言之间切换 - documentElement.lang

javascript - 在下拉菜单中切换同一类的各个元素

javascript - 在单个页面上绘制多个 Canvas

javascript - NestJS 中的模块

javascript - 加载重型 png 图像时的 Gif 加载器

javascript - 如何使用 Sweet Alert 进行确认?