Javascript ASP.NET MVC控制器方法从jQuery接收空对象

Javascript ASP.NET MVC控制器方法从jQuery接收空对象,javascript,c#,jquery,asp.net-mvc,Javascript,C#,Jquery,Asp.net Mvc,我有一个jQuery脚本,它将表单捕获到一个对象中,并将该对象发送到一个控制器方法。以下是脚本: var modalConfirm = function (callback) { $("#modal-btn-si").on("click", function () { callback(true); $("#modal-confirm").modal('hide'); }); $("#modal-btn-no").on("click", function () { cal

我有一个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) { ... }
我试过的 在脚本上:

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),
}); }
  • .serialize()
    而不是
    .serializeArray()
  • 根本不序列化
  • 将整个“表单”传递给对象,然后传递给控制器
  • JSON.stringify
    (实际状态)并且不使用它
  • 手动建立
    数据中的每个字段
  • 手动在
    数据中建立每个字段,并应用
    JSON.stringify
在控制器上:

  • [FromForm]
    &
    [FromBody]
  • [Bind]
  • 每个字段只有一个变量,匹配名称和类型
我尝试过的每一件事都以控制器的方法没有收到任何结果而告终。我跟踪了脚本(这就是为什么您会在其中看到一个
调试器;
断点),它将对象正确地放入数组,每个字段都有正确的值:

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

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

编辑

根据要求,以下是我在表单中捕获的视图部分:

<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>

@使用(Html.BeginForm(“NuevaOpcion”,“Home”,FormMethod.Post,new{@id=“frm_nueva_opcion”})){
@Html.HiddenFor(m=>m.Id)
Añ;adir nueva opció;n
Es opció;n额外费用
&欧元;
瓜达尔
你想知道什么是行动吗?
@DropDownList(“OptionSelectedItem”,listItems,new{@class=“form control”})
}
jquery
$.post()
方法使用默认的
contentType='application/x-www-form-urlencoded发送数据;charset=UTF-8'
需要保存数据的位置

要将
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
,如果请求中不包含它,它的值将是
0


我还强烈建议您使用
HtmlHelper
方法来强绑定到您的模型,并确保正确的
名称
数据val-*
属性用于双向模型绑定和客户端验证。

使用
.serialize()
,而不是
.serializeArray()
,您需要删除
contentType:“application/JSON”,
并使用
$.post(“NuevaOpcion”,datos)
(其中
datos
$('#'+form.)。serialize();
)。假设表单的名称属性与属性的名称匹配(您需要显示视图)@StephenMuecke再次向您表示感谢。这实际上解决了它!我真不敢相信,从昨天起我就一直受着这个****的折磨。如果你不介意的话,你能告诉我我错过了什么吗?顺便问一下,你是想发布答案还是我应该发布?再次感谢。我会在30分钟左右添加一个答案,再解释一下。@StephenMuecke感谢您的时间和帮助,非常感谢。