我想将整个JSON对象传递到MVC中的控制器,以便我可以访问整个对象。 我正在使用以下代码..
在视图中调用的脚本
var Email = {
To: $("#txtTo").val(),
Text: $("#txtTest").val(),
Subject: $("#txtSubject").val()
};
$.ajax({
type: "POST",
url: ("Controller/SendEmail"),
data: JSON.stringify(Email ),
datatype: "json",
contentType: "application/json; charset=utf-8",
cache: false,
success: function(htmlResult) {
alert("Mail Send")
},
error: function(msg) { alert("Error Occurs."); }
});
但是当我在控制器中调用它时:
public ActionResult SendEmail(Model model)
{
string to = model.To ;
}
它给出了null。如何解决这个问题?
答案 0 :(得分:1)
如果你只发送data: Email
而不是它的字符串化表示,那么modelbinder就能将传递的参数绑定到actions输入参数。
通过这种方式,数据不会通过JSON.stringify
处理,而是通过$.param
处理,这将为您提供一个字符串:
To=abc&Text=xyz&Subject=123
参数始终如何发布到服务器。因此,这相当于一次传递一个变量。如果这些参数的名称与输入参数对象中的属性名称匹配,则默认模型绑定器将尝试使用发布的数据填充该对象。
答案 1 :(得分:0)
你必须创建一个这样的类:
public class ObjectFilter : ActionFilterAttribute
{
public string Param { get; set; }
public Type RootType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json"))
{
object o = new System.Runtime.Serialization.Json.DataContractJsonSerializer(RootType).ReadObject(filterContext.HttpContext.Request.InputStream);
filterContext.ActionParameters[Param] = o;
}
}
}
您希望传递给JSON的类如下:
public class Email
{
public To{ get; set; }
public string Subject { get; set; }
public string Text { get; set; }
}
现在必须将此类作为控制器中的属性调用为:
[ObjectFilter(Param = "model", RootType = typeof(Email))]
public ActionResult SendEmail(Email model)
{
string to = model.To ;
}
这将为您提供所需的结果。