如何使用ajax调用将模型传递给控制器​​操作?

时间:2017-02-05 21:10:59

标签: jquery ajax asp.net-mvc

我使用ajax调用将模型数据传递给我的控制器操作,但是当我通过ajax调用时,控制器会收到空模型, 这是我的控制器

[HttpPost]
public ActionResult Edit( int id, ALDS.Web.Areas.Direct2M3.Models.ItemInputModel collection)
{
    try
    {
        // TODO: Add update logic here
        return View("Index");
    }
    catch
    {
        return View();
    }
}

这是我的输入模型

public class ItemInputModel
{
    [Key]
    public long ID { get; set; }
    [DisplayName("Buyer Code")]
    public string ModelCode { get; set; }
    [DisplayName("BOM Description")]
    public string BOMDescription { get; set; }
    //BUYER CODE
    [DisplayName("UOM")]
    public string UOM { get; set; }
    [DisplayName("Alternative UOM")]
    public string AltUOM { get; set; }
    [DisplayName("Garment Color Wise")]
    public string ColorWise { get; set; }
    [DisplayName("Garment Size Wise")]
    public string SizeWise { get; set; }
    [DisplayName("RM Color Wise")]
    public string RMcolorWise { get; set; }
    [DisplayName("RM Size Wise")]
    public string RMsize { get; set; }
    [DisplayName("Procument Group")]
    public string BrandixProcurementGroupCode { get; set; }
    [DisplayName("Designation CPT")]
    public string DesignationCPT { get; set; }
    [DisplayName("Item Name")]
    public string ItemName { get; set; }
    [DisplayName("Fabric Composition")]
    public string FabricComposition { get; set; }
    [DisplayName("Hierachy Code ")]
    public string HierarchyCode { get; set; }
    [DisplayName("GSM Value")]
    public string GSMValue { get; set; }
    [DisplayName("RM Width")]
    public string RMWidth { get; set; }
}

这是我在视图中的ajax调用

$.ajax({
    type: 'POST',
    dataType: 'application/json; charset=utf-8',
    cache: false,
    url: '/ItemMaster/Edit',
    data:{ id: collection.ID, collection:collection},
    success: function (data, textStatus, jqXHR) {
        alert("ok");
        //Do Stuff 
        //$("#DailyInvoiceItems").html(data.Id);
    },
    error: function (jqXHR, textStatus, errorThrown) {
        alert('Failed');
        //Do Stuff or Nothing
    }
});

我正在使用这个模型传递给ajax

的动作
var model = {
    ID: $('#ID').val(),
    ModelCode: $('#txtModelCode').val(),
    BOMDescription: $('#txtBOMDescription').val(),
    UOM: $('#txtUOM').val(),
    AltUOM: $('#txtAltUOM').val(),
    ColorWise: $('#ddnColorWise').val(),
    SizeWise: $('#ddnSizeWise').val(),
    RMcolorWise: $('#ddnRMcolorWise').val(),
    RMsize: $('#ddnRMsize').val(),
    BrandixProcurementGroupCode: $('#ddnBrandixProcurementGroupCode').val(),
    DesignationCPT: $('#txtDesignationCPT').val(),
    ItemName: $('#txtItemName').val(),
    FabricComposition: $('#txtFabricComposition').val(),
    HierarchyCode: $('#txtHierarchyCode').val(),
    GSMValue: $('#txtGSMValue').val(),
    RMWidth: $('#txtRMWidth').val()
};

我在action方法中放置了一个断点并检查了collection参数,但它是一个空的输入对象,具有null属性! 谁能帮我???? Thankz,

1 个答案:

答案 0 :(得分:2)

ajax代码有很多错误。首先你的方法返回html(一个视图 - 虽然它应该是一个局部视图)所以它需要是dataType: 'html',或者你可以完全省略它。其次,因为您发送包含对象的对象,您需要对数据进行字符串化(使用data: JSON.stringify({ id: collection.ID, collection: model}),并添加contentType: 'application/json; charset=utf-8',选项(注意您的javascript对象的名称是model,而不是{{ 1}}。

但是大部分代码都是不必要的。您的模型已包含属性collection,因此无需发布和绑定它两次,您的控制器方法可以只是

long ID

假设您使用强类型[HttpPost] public ActionResult Edit(ItemInputModel model) { .... return PartialView(..), // not View(..) } 方法正确生成了表单控件,例如

HtmlHelper

然后您可以使用@Html.HiddenFor(m => m.ID) @Html.TextBoxFor(m => m.ModelCode) .... 方法正确序列化所有表单控件,以便您的ajax成为

.serialize()

附注:您应始终使用var data = $('form').serialize(); // or use the id of the form is you have given it one $.ajax({ type: 'POST', dataType: 'html', // this can be omitted - the ajax() function will work it out cache: false, url: '/ItemMaster/Edit', data: data, success: function (data, textStatus, jqXHR) { ... // append the partial view you return to the DOM? }, error: function (jqXHR, textStatus, errorThrown) { .... } }); 生成正确的网址,例如Url.Action()。如果此脚本位于外部文件中,则在主视图中生成它(例如,作为您处理的按钮元素的url: '@Url.Action("Edit", "ItemMaster")',属性)并将其传递给函数。