Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC4中,jQuery总是将null发布到操作_C#_Asp.net Mvc_Jquery - Fatal编程技术网

C# 在MVC4中,jQuery总是将null发布到操作

C# 在MVC4中,jQuery总是将null发布到操作,c#,asp.net-mvc,jquery,C#,Asp.net Mvc,Jquery,我有一个问题,我不知道是什么问题。 我正在构造一个Json对象,我想用$.ajax将其发回。问题是我总是在我的行动中得到零。 以下是Ajax部分: $("input[type=button]#ajax-editor-save").click(function() { var hotelPropertyAssignModel = new Object(); hotelPropertyAssignModel.Hotel_Id

我有一个问题,我不知道是什么问题。 我正在构造一个Json对象,我想用$.ajax将其发回。问题是我总是在我的行动中得到零。 以下是Ajax部分:

            $("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)
            });
        });
以下是行动:

我将参数更改为string,以验证json是如何产生的。当我用正确的模型替换它时,我也会得到null!
有人可以帮忙吗?

请确保设置了正确的内容类型:

$.ajax({
    url: '@Url.Action( "SetProperties" )',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(hotelPropertyAssignModel)
});
您使用的dataType参数指示响应类型,而不是请求类型。如果控制器操作正确设置了Content-Type响应头,则不需要它,如果您返回例如JsonResult,则通常会这样做

但是从我所看到的,你的控制器动作被声明为无效,这显然是错误的。控制器操作必须返回操作结果。如果您不关心内容,只需使用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;
});

确保设置了正确的contentType:

$.ajax({
    url: '@Url.Action( "SetProperties" )',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(hotelPropertyAssignModel)
});
您使用的dataType参数指示响应类型,而不是请求类型。如果控制器操作正确设置了Content-Type响应头,则不需要它,如果您返回例如JsonResult,则通常会这样做

但是从我所看到的,你的控制器动作被声明为无效,这显然是错误的。控制器操作必须返回操作结果。如果您不关心内容,只需使用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;
});

那么您发送的JSON结构与您的视图模型不匹配。顺便问一下,您使用的是哪个版本的ASP.NET MVC?如果是2或更早,不要忘记它不支持现成的JSON请求。正如Phil Haack在这篇博文中解释的那样,您必须编写一个定制的JsonValueProviderFactory:如果您使用的是ASP.NET MVC 3或更高版本,您不需要它,因为它是内置的。谢谢您的回复。我尝试了你的两种解决方案。不幸的是,它仍然不起作用!我正在使用MVC4。这意味着我应该写我认为的JsonValueProviderFactory!哦,等等,我没注意到你的控制器动作。它使用字符串参数而不是视图模型!!!!我会马上更新我的答案。好的,答案更新了。您应该定义一个视图模型。我不知道您希望如何将JSON绑定到字符串参数。再次感谢您的回复!但正如我在问题中提到的,我将模型更改为字符串,以验证它是无法正确绑定数据,还是问题出在其他方面。我在代码中有这个视图模型。那么您发送的JSON结构与您的视图模型不匹配。顺便问一下,您使用的是哪个版本的ASP.NET MVC?如果是2或更早,不要忘记它不支持现成的JSON请求。正如Phil Haack在这篇博文中解释的那样,您必须编写一个定制的JsonValueProviderFactory:如果您使用的是ASP.NET MVC 3或更高版本,您不需要它,因为它是内置的。谢谢您的回复。我尝试了你的两种解决方案。不幸的是,它仍然不起作用!我正在使用MVC4。这意味着我应该写我认为的JsonValueProviderFactory!哦,等等,我没注意到你的控制器动作。它使用字符串参数而不是视图模型!!!!我会更新我的answe
r现在。好的,答案更新。您应该定义一个视图模型。我不知道您希望如何将JSON绑定到字符串参数。再次感谢您的回复!但正如我在问题中提到的,我将模型更改为字符串,以验证它是无法正确绑定数据,还是问题出在其他方面。我有代码中的viewModel。