jQuery allways在MVC 4中将null发布到Action

时间:2013-01-31 15:52:59

标签: c# asp.net-mvc jquery

我遇到了问题,我不知道是什么问题。
我正在构建一个Json对象,我想用$.ajax发回它。问题是我的行动总是无效 这是Ajax Part:

            $("input[type=button]#ajax-editor-save").click(function() {

            var hotelPropertyAssignModel = new Object();
            hotelPropertyAssignModel.Hotel_Id = 1;
            hotelPropertyAssignModel.HotelProperties = new Array();

            $("input.ajax-editor[data-edited=true]").each(function() {
                var hotelPropertyValue = new Object();
                hotelPropertyValue.HotelProperty_Id = $(this).attr("data-hotelPropertyId");
                hotelPropertyValue.Language = $(this).attr("data-lang");
                hotelPropertyValue.Value = $(this).attr("value");
                hotelPropertyAssignModel.HotelProperties.push(hotelPropertyValue);
            });

            $.ajax({
                url: '@Url.Action( "SetProperties" )',
                type: 'POST',
                dataType: 'json',
                data: JSON.stringify(hotelPropertyAssignModel)
            });
        });

这是行动:

[AcceptVerbs( HttpVerbs.Post )]
[HttpPost]
public void SetProperties ( string hotelPropertyAssignModel )
{

}

我将参数更改为string以验证json的来源。当我用正确的模型替换它时,我得到null! 任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

确保设置正确的contentType:

$.ajax({
    url: '@Url.Action( "SetProperties" )',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(hotelPropertyAssignModel)
});

您使用的dataType参数表示响应类型,而不是请求类型。如果您的控制器操作正确设置了Content-Type响应头,那么您不需要它,如果您返回例如JsonResult,它通常会执行该操作。

但是从我可以看到你的控制器动作被宣布为无效显然是错误的。控制器操作必须返回操作结果。如果您不关心内容,只需使用EmptyResult

[AcceptVerbs( HttpVerbs.Post )]
[HttpPost]
public ActionResult SetProperties ( string hotelPropertyAssignModel )
{
    ...
    return new EmptyResult();
}

此外,您的控制器操作还有另一个非常严重的问题。它采用字符串参数而不是视图模型!我不知道您可能希望将JSON请求绑定到某个字符串。

因此,立即定义一个与您愿意发送的JSON结构相匹配的视图模型:

public class HotelAssignmentViewModel
{
    public int Hotel_Id { get; set; } 
    public HotelPropertyViewModel[] HotelProperties { get; set; }
}

public class HotelPropertyViewModel
{
    public int HotelProperty_Id { get; set; }
    public string Language { get; set; }
    public string Value  { get; set; }
}

然后让控制器操作将此视图模型作为参数:

[AcceptVerbs( HttpVerbs.Post )]
[HttpPost]
public ActionResult SetProperties ( HotelAssignmentViewModel model )
{
    ...
    return new EmptyResult();
}

我还注意到您的代码存在另一个问题。您似乎已订阅某些DOM元素的click事件以触发AJAX请求,但您永远不会通过从此事件返回false来取消默认操作。因此,例如,如果这是一个提交按钮或一个锚点,它只会将浏览器重定向远离页面,从而没有时间执行您的AJAX请求。因此,请确保通过从单击处理程序返回false来取消此默认操作:

$("input[type=button]#ajax-editor-save").click(function() {
    ...
    return false;
});