如何解决在MVC 3.0中将JSON返回给Action
| 我承认,我很困惑: 我正在尝试返回一个已转换为JSON的简单对象,如下所示: viewModel.updateCoder = function (coder) {
var coderJson = ko.toJSON(coder);
var coderJsonString = ko.utils.stringifyJson(coderJson);
$.ajax({
url: \"provider/UpdateCoder\",type: \'POST\',dataType: \'text\',data: coderJsonString,contentType: \'text/csv\',success: function () { alert(\"Updated!\"); }
});
我的RouteTable条目如下所示:
routes.MapRoute(
\"UpdateCoder\",\"provider/UpdateCoder/{coderDTO}\",// URL with parameters
new { controller = \"Provider\",action = \"UpdateCoder\",coderDTO = UrlParameter.Optional }
);
我的Controler动作如下所示:
[AcceptVerbs(HttpVerbs.Post)]
public string UpdateCoder( string coderDTO )
{
var rslt = \"success\";
//var coder = coderDTO.CoderDTOToCoder();
return rslt;
}
我在UpdateCoder参数(字符串coderDTO)中得到的是一个null;
这是我的后备位置,我希望将JSON对象(coderJson)发送给操作,但是会收到错误消息:\“为此对象未定义无参数的构造函数。\”当我这样做时,参数类型如下:
[AcceptVerbs(HttpVerbs.Post)]
public string UpdateCoder( **CoderDTO coderDTO** )
{
var rslt = \"success\";
//var coder = coderDTO.CoderDTOToCoder();
return rslt;
}
以及:ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());在Global.asax中
CoderDTO类如下所示:
public class CoderDTO
{
public Int32 Id { get; set; }
public String CoderCode { get; set; }
public String Sal { get; set; }
public String LName { get; set; }
public String FName { get; set; }
public String MI { get; set; }
public String Facility { get; set; }
public String Title { get; set; }
public Boolean? IsContract { get; set; }
public Boolean? IsInactive { get; set; }
public Boolean? IsDeleted { get; set; }
public String Comments { get; set; }
public String AlternateId { get; set; }
public int CasesCoded { get; set; }
public CoderDTO(Coder coder)
{
Id = coder.Id;
CoderCode = coder.CoderCode;
Sal = coder.Sal;
LName = coder.LName;
FName = coder.FName;
MI = coder.MI;
Facility = coder.Facility;
Title = coder.Title;
if (coder.IsContract != null) IsContract = coder.IsContract;
if (coder.IsInactive != null) IsInactive = coder.IsInactive;
if (coder.IsDeleted != null) IsDeleted = coder.IsDeleted;
Comments = coder.Comments;
AlternateId = coder.AlternateId;
}
public Coder CoderDTOToCoder()
{
var coder = new Coder
{
Id = Id,CoderCode = CoderCode,Sal = Sal,LName = LName,FName = FName,MI = MI,Facility = Facility,Title = Title
};
coder.IsContract = IsContract ?? false;
coder.IsInactive = IsInactive ?? false;
coder.IsDeleted = IsDeleted ?? false;
coder.Comments = Comments;
coder.AlternateId = AlternateId;
return coder;
}
}
coderJsonString看起来像这样:
{\"Id\":201,\"CoderCode\":\"GP \",\"Sal\":null,\"LName\":null,\"FName\":null,\"MI\":null,\"IsContract\":false,\"IsInactive\":false,\"Comments\":null,\"CasesCoded\":0,\"isBeingEdited\":false}
真是漫长的一天!感谢您的帮助,我正在吃晚饭!!
解决方法
我认为您最好的选择是试图弄清楚为什么不能对DTO进行反序列化。您至少需要向其添加一个默认构造函数。
public CoderDTO() { }
对于当前使用传递字符串的情况,我认为您应该这样称呼它:
viewModel.updateCoder = function (coder) {
var coderJson = ko.toJSON(coder);
var coderJsonString = ko.utils.stringifyJson({ coderDTO: coderJson });
$.ajax({
url: \"provider/UpdateCoder\",type: \'POST\',dataType: \'text\',data: coderJsonString,contentType: \'application/json; charset=utf-8\',success: function () { alert(\"Updated!\"); }
});
因此,基本上,您将创建一个具有参数名称和值的对象并对其进行字符串化。在这种情况下,coderJson是双重编码的。
, 我找到了以下问题的答案:为什么我无法返回反序列化到我的CoderDTO对象的JSON:我的对象没有无参数的公共构造函数。我有一个Coder的构造函数参数,该参数填充了CoderDTO。我将其拆分为一个单独的方法,现在可以使用了。
感谢发布者
StackOverflow-ASP.NET MVC 3 JSONP:这可与JsonValueProviderFactory一起使用吗?
, 尝试更改您的操作以使用JsonResult:
[AcceptVerbs(HttpVerbs.Post)]
public JsonResult UpdateCoder(CoderDTO coderDTO)
{
var rslt = \"success\";
//var coder = coderDTO.CoderDTOToCoder();
return Json(rslt);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。