Javascript 将JSON字符串发布到ASP.NET MVC 3操作将导致空参数
我将向asp.NETMVC发布一个JSON字符串,如下所示 AJAX调用Javascript 将JSON字符串发布到ASP.NET MVC 3操作将导致空参数,javascript,asp.net,json,asp.net-mvc-3,Javascript,Asp.net,Json,Asp.net Mvc 3,我将向asp.NETMVC发布一个JSON字符串,如下所示 AJAX调用 $.ajax({ type: "POST", url: "@(storeLocation)IDR/OpcInsertCustomerProfile/", data: JSON.stringify(currSelection), contentType: "application/json", succes
$.ajax({
type: "POST",
url: "@(storeLocation)IDR/OpcInsertCustomerProfile/",
data: JSON.stringify(currSelection),
contentType: "application/json",
success: function(data) {
alert('success : ' + JSON.stringify(data));
},
error: function(data) {
alert('Error : ' + JSON.stringify(data));
}
}
);
在控制器中:
[HttpPost]
[ActionName("OpcInsertCustomerProfile")]
public JsonResult OpcInsertCustomerProfile(string currSelectionData)
{
try
{
JavaScriptSerializer ser = new JavaScriptSerializer();
var res = ser.Serialize(currSelectionData);
return Json(currSelectionData, JsonRequestBehavior.AllowGet);
}
catch (Exception exc)
{
return Json(new { error = 1, message = exc.Message });
}
}
调试器指示成功调用该操作,但接收的传入字符串参数始终为null。Firebug“post”显示传出参数是正确的json对象。我希望看到JSON字符串作为传入参数。请注意,我不想将其反序列化为适当的对象。我所要做的就是将字符串以JSON格式“原样”存储在数据库中。稍后,需要将其检索并按原样传递给Javascript。尝试以下操作:
$.ajax({
type: "POST",
url: "@(storeLocation)IDR/OpcInsertCustomerProfile/",
data: { "currSelectionData" : "'" + JSON.stringify(currSelection) + "'" },
contentType: "application/json",
success: function(data) {
alert('success : ' + JSON.stringify(data));
},
error: function(data) {
alert('Error : ' + JSON.stringify(data));
}
}
);
看看您的操作方法:该方法接受带有序列化JSON的字符串,然后再次将该字符串序列化为JSON,然后取消结果并再次序列化并返回相同的字符串,这是否正确
如果您使用application/json类型发送请求,ASP.NET MVC会尝试反序列化接收到的字符串并将其绑定到操作参数:在您的情况下,它会尝试在json对象中查找属性currSelectionData。那个财产存在吗?也许您希望整个字符串作为
currSelectionData
参数接收?然后您需要使用FormCollection或Request.Form,因为默认的model binder不支持这一点。实际上,我用json填充国家选择中的状态下拉列表,我喜欢这样
在我的控制器中,我有一个操作,它以json格式返回我的数据,如下所示
public JsonResult State(int countryId)
{
var stateList = CityRepository.GetList(countryId);
return Json(stateList, JsonRequestBehavior.AllowGet);
}
在我看来
<script type="text/javascript">
function cascadingdropdown() {
$("#stateID").empty();
$("#stateID").append("<option value='0'>--Select State--</option>");
var countryID = $('#countryID').val();
$.ajax({
url: "/City/State",
dataType: 'json',
data: { countryId: countryID },
success: function (data) {
$("#stateID").empty();
$("#stateID").append("<option value='0'>--Select State--</option>");
$.each(data, function (index, optiondata) {
alert(optiondata.StateName);
$("#stateID").append("<option value='" + optiondata.ID + "'>" + optiondata.StateName + "</option>");
});
},
error: function () {
alert('Faild To Retrieve states.');
}
});
}
</script>
函数cascadingdropdown(){
$(“#stateID”).empty();
$(“#stateID”).append(“--Select State--”);
var countryID=$('#countryID').val();
$.ajax({
url:“/城市/州”,
数据类型:“json”,
数据:{countryId:countryId},
成功:功能(数据){
$(“#stateID”).empty();
$(“#stateID”).append(“--Select State--”);
$.each(数据、函数(索引、选项数据){
警报(optiondata.StateName);
$(“#stateID”).append(“+optiondata.StateName+”);
});
},
错误:函数(){
警报(“检索状态失败”);
}
});
}
我认为这将帮助您……一种方法是允许操作将参数作为POST数据而不是JSON“字符串化”数据接收。为此,在不使用JSON.Stringify的情况下发布数据。希望这就是你需要的
如果没有,您可能想尝试创建一个对象来接收这个简单的数据。通过Ajax发送json时,我认为这是Ajax中数据属性的正确方法:
数据:“{'parameterNameInAction':'”+JSON.stringify(jsonData)+“}”
执行上述操作会导致以下错误500内部服务器错误无效JSON原语:currSelectionData。描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。异常详细信息:System.ArgumentException:无效的JSON原语:currSelectionData。然后尝试如下方式:数据:{“currSelectionData”:“'”+JSON.stringify(currSelection)+“'”}有关详细信息,请查看此数据:{currSelectionData:JSON.stringify(currSelection)}-您是对的!我希望整个字符串作为参数接收。此外,我不希望传入字符串和现有对象之间有任何映射。整个传入字符串需要保存在数据库中(JSON格式)。请您进一步介绍一下您建议的备选方案,好吧,看来asp.NETMVC会自动将传入的JSON对象映射到各个对象。这很有趣,但我需要将整个json对象捕获为单个独立字符串。我该怎么做?