将整个JSON对象传递给MVC的控制器

时间:2011-12-09 07:20:53

标签: asp.net-mvc

我想将整个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。如何解决这个问题?

2 个答案:

答案 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 ;
    }

这将为您提供所需的结果。