gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:11:54 25 4
gpt4 key购买 nike

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

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

以及 Controller 的方法签名:

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

我尝试过的

关于脚本:

  • .serialize() 而不是 .serializeArray()
  • 根本不序列化。
  • 将整个“表单”传递给对象,然后传递给 Controller ​​。
  • JSON.stringify(实际状态)并且不使用它。
  • 手动建立data中的每个字段。
  • 手动建立data中的每个字段并应用JSON.stringify

在 Controller 上:

  • [FromForm] & [FromBody]
  • [绑定(bind)]
  • 每个字段都有一个变量,匹配名称和类型。

我尝试过的所有操作最终都导致 Controller 的方法没有收到任何信息。我跟踪了该脚本(这就是为什么您在其中看到一个 debugger; 断点),它正确地将对象获取到数组中,每个字段都有正确的值:

Script debug screenshot

但仍然用空对象击中 Controller :

Controller's method debug screenshot

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

编辑

根据要求,这是我捕获到表单中的 View 部分:

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

最佳答案

jquery $.post()方法使用默认 contentType='application/x-www-form-urlencoded; charset=UTF-8' 发送数据其中数据需要为 PlainObject .

对于DefaultModelBinder要绑定(bind)到您的模型,对象的名称/值对需要与模型属性匹配,因此格式需要为

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方法强绑定(bind)到您的模型,并确保正确 name , valuedata-val-*添加属性用于双向模型绑定(bind)和客户端验证。

关于javascript - ASP.NET MVC Controller 方法从 jQuery 接收空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52182559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com