使用C#将多个参数发布到MVC控制器

Aqu*_*tar 4 c# asp.net-mvc

我将一个json对象发布到带有C#代码的ASP.Net MVC控制器.为了简化这个示例,对象只是一个具有make和model属性的汽车.一切都适用于下面的代码.我的问题是 - 如何发布多个参数?例如,我如何发布JSON对象,电子邮件地址和电话号码?

    //post to form
    string requestData = "{\"Make\":\"Ford\",\"Model\":\"Mustang\"}";
    byte[] data = Encoding.UTF8.GetBytes(requestData);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://receiving.url/showdata");
    request.Method = "POST";
    request.ContentType = "application/json";
    Stream dataStream = request.GetRequestStream();
    dataStream.Write(data, 0, data.Length);
    dataStream.Close();

    WebResponse response = request.GetResponse();
    string result = new StreamReader(response.GetResponseStream()).ReadToEnd();
    Console.Write(result);
Run Code Online (Sandbox Code Playgroud)

这是从代码中检索json对象的Controller代码,然后输出json以进行验证.

    [HttpPost]
    public JsonResult showdata(Car c)
    {
        return Json(c, JsonRequestBehavior.AllowGet);
    }
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

    [HttpPost]
    public JsonResult showdata(Car c, string email, string phone)
    {

        return Json(c, JsonRequestBehavior.AllowGet);
    }
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 9

像这样:

string requestData = "{\"c\": {\"Make\":\"Ford\",\"Model\":\"Mustang\"}, \"email\": \"foo@bar.com\", \"phone\": \"1111\"}";
Run Code Online (Sandbox Code Playgroud)

甚至更好地使用JavascriptSerializer:

using System;
using System.Net;
using System.Text;
using System.Web.Script.Serialization;

class Program
{
    static void Main()
    {
        var serializer = new JavaScriptSerializer();
        string requestData = serializer.Serialize(new
        {
            c = new
            {
                make = "Ford",
                model = "Mustang"
            },
            email = "foo@bar.com",
            phone = "1111"
        });

        using (var client = new WebClient())
        {
            client.Headers[HttpRequestHeader.ContentType] = "application/json";
            var result = client.UploadData("http://receiving.url/showdata", Encoding.UTF8.GetBytes(requestData));
            Console.WriteLine(Encoding.UTF8.GetString(result));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将正确处理JSON序列化您的对象,就像您使用这些字符串连接一样,如果数据包含一些特殊字符,您的请求可能会轻易破坏.

哦,在我忘记之前:使用视图模型.

所以代替:

[HttpPost]
public JsonResult showdata(Car c, string email, string phone)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

你肯定应该:

[HttpPost]
public ActionResult ShowData(ShowDataViewModel data)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后:

string requestData = serializer.Serialize(new
{
    make = "Ford",
    model = "Mustang",
    email = "foo@bar.com",
    phone = "1111"
});
Run Code Online (Sandbox Code Playgroud)

还有一句话:JsonRequestBehavior.AllowGet当您修改控制器操作时,在返回JSON时不需要,[HttpPost]因此永远不能使用GET动词调用此操作.