ASP.NET MVC Controller方法从jQuery接收空对象

问题描述 投票:0回答:1

我有一个jQuery脚本,将表单捕获到一个对象,并应该将该对象发送到控制器方法。这是脚本:

var modalConfirm = function (callback) {
$("#modal-btn-si").on("click", function () {
    callback(true);
    $("#modal-confirm").modal('hide');
});
$("#modal-btn-no").on("click", function () {
    callback(false);
    $("#modal-confirm").modal('hide');
});};

function confirmar(form, text) {
$("#modal-confirm").modal('show');
modalConfirm(function (confirm) {
    if (confirm) {
        enviar(form);
    }
}); };

function enviar(form) {
debugger;
var datos = $('#' + form).serializeArray(),
    dataObj = {};
$(datos).each(function (i, field) {
    dataObj[field.name] = field.value;
});
if (typeof dataObj["precio"] === "undefined") { dataObj["precio"] = 0; }
$.post("NuevaOpcion", {
    contentType: "application/JSON",
    data: JSON.stringify(dataObj),
}); }

注意:脚本原本要简单得多,但是试图解决我所描述的问题迫使我将代码划分为您看到的函数。

我创建了一个模型来接收表单的数据:

public class NuevaOpcionFormModel {

    public NuevaOpcionFormModel() { }

    public int Id { get; set; }
    public string nombre { get; set; }
    public int cantidad { get; set; }
    public int precio { get; set; }
    public int idrespuesta { get; set; }
    public int OptionSelectedItem { get; set; }
}

和控制器的方法签名:

[HttpPost]
    public ActionResult NuevaOpcion (Dayvo.Presupuestador.Web.Models.Form.NuevaOpcionFormModel nuevaOpcion) { ... }

我试过的

在脚本上:

  • .serialize()而不是.serializeArray()
  • 根本没有序列化。
  • 将整个'形式'传递给对象然后传递给控制器​​。
  • JSON.stringify(实际状态)而不使用它。
  • 手动在data中建立每个字段。
  • 手动建立qazxsw poi中的每个字段并应用qazxsw poi。

在控制器上:

  • dataJSON.stringify
  • [FromForm]
  • 每个字段的单个变量,匹配名称和类型。

我尝试过的所有东西都以控制器的方法得不到任何结果。我跟踪了脚本(这就是你在其中看到[FromBody]断点的原因),它正确地将对象放入数组中,每个字段都有正确的值:

[Bind]

但仍然用空对象命中控制器:

debugger;

关于我做错的任何线索都非常受欢迎。提前致谢。

编辑

根据要求,这是我正在捕捉到表单中的视图部分:

Script debug screenshot
javascript c# jquery asp.net-mvc
1个回答
1
投票

jquery Controller's method debug screenshot方法使用默认的<div class="panel-footer"> @using (Html.BeginForm("NuevaOpcion", "Home", FormMethod.Post, new { @id = "frm_nueva_opcion" })) { @Html.HiddenFor(m => m.Id) <div class="row"> <div class="col-md-6"> <div class="form-group" style="margin-bottom: .7em;margin-top: .7em;"> <button class="btn btn-success btn-xs" type="button" onclick=" $('#row-nueva-opcion').toggle()" id="add-opcion"> <span class="glyphicon glyphicon-plus-sign"></span> A&ntilde;adir nueva opci&oacute;n </button> </div> </div> </div> <div class="row" id="row-nueva-opcion" style="display:none"> <div class="col-md-10"> <label> <input type="checkbox" id="opcion-extra" onclick=" $('#nuevo-precio').attr('disabled', !this.checked);" /> Es opci&oacute;n extra </label> <div class="input-group" style="margin-bottom:1.7em;"> <input type="text" placeholder="Opción" class="form-control" name="nombre" style="max-width:70%;"> <input type="number" placeholder="Cantidad" min="1" value="1" class="form-control" name="cantidad" style="max-width:15%;"> <input type="number" placeholder="Precio" class="form-control" id="nuevo-precio" name="precio" style="max-width:15%;" disabled> <input type="hidden" name="idrespuesta" id="idrespuesta" value="@listItems.Select(x=>x.Value).FirstOrDefault()" /> <div class="input-group-addon">&euro;</div> <span class="input-group-btn"> <a class="btn btn-primary" data-title="Confirmación de acción" data-toggle="modal" data-target="#modal_confirm" onclick="confirmar('frm_nueva_opcion')"> <span class="glyphicon glyphicon-floppy-disk"></span> Guardar </a> </span> </div> </div> <div class="col-md-8"> <div class="form-group"> <label> ¿Para que pregunta es la opción? @Html.DropDownList("OptionSelectedItem", listItems, new { @class = "form-control" }) </label> </div> </div> </div> } </div> 发送数据,其中数据需要为$.post()

要使contentType='application/x-www-form-urlencoded; charset=UTF-8'绑定到您的模型,对象的名称/值对需要与模型属性匹配,因此格式需要是

PlainObject

要生成该对象,要么手动生成,要么更好,使用DefaultModelBinder方法(而不是var data = { Id: someValue, nombre: anotherValue, .... }; )正确序列化所有表单控件。将脚本更改为

.serialize()

请注意,目前尚不清楚您对.serializeArray()代码的期望是什么,但它是不必要的并且可以省略 - 您的function enviar(form) { var data = $('#' + form).serialize(); $.post("NuevaOpcion", data, function(response) { ... // code to execute when the response is returned }); 属性是if (typeof dataObj["precio"] === "undefined") { dataObj["precio"] = 0; },如果它不包含在请求中,它将具有值precio

我还强烈建议您使用int方法强烈绑定到您的模型,并确保为双向模型绑定和客户端验证添加正确的0HtmlHelpername属性。

© www.soinside.com 2019 - 2024. All rights reserved.