1

在回发请求中,当我需要发布值时,我确实喜欢这样

[HttpPost]
public ActionResult Index()
{
    //i need to get values in here not in action method argument
    //i know this works but not like this --> ActionResult Index(string Name)

    string Name = Request.Form["Name"];
}  

但是在 ajax 请求中这不起作用,而且我找不到 mvc 存储 ajax 发布值的位置

有什么建议么?

4

2 回答 2

2

我参加聚会有点晚了,但我将提供一个替代方案,允许您使用 Ajax 帖子/表单访问 Request.Form。这在 MVC 4 和 jQuery 1.9.1 中进行了测试。

如果控制器的 Request.Form 没有为您的 Ajax 帖子填充,可能是因为您手动序列化数据并将数据发送到 contentType 为的控制器application/json(常见场景)。

这是一个不会在控制器上填充 Request.Form 的 jQuery.ajax 示例。

    // JSON serialized form data.
    var data = {"id" : "1234", "name" : "Dave"};

    $.ajax({
        type: "POST",
        url: serviceUrl,
        contentType: "application/json",
        dataType: "json",
        data: JSON.stringify(data || {}),
        success: function () { }
    });

更改 contentType 将导致控制器像提交表单一样处理帖子。

    // Form encoded data.  See jQuery.serialize().
    var data = "id=1234&name=Dave";

    $.ajax({
        type: "POST",
        url: serviceUrl,
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        dataType: "json",
        data: data,
        success: function () { }
    });

您也可以将 contentType 保留为未定义,因为application/x-www-form-urlencoded; charset=UTF-8它是 jQuery 的默认值。

我会注意到我只使用$.ajax来更好地说明正在发生的事情。您也可以使用$.post,尽管您仍然需要发送表单编码数据

于 2013-03-12T14:51:47.463 回答
0

ajax 发布的值不会出现在集合的请求中,但是您可以使用ValueProviderMVC 中的基础设施来获取您的 Ajax 发布的值:

[HttpPost]
public ActionResult Index()
{
    Name = ValueProvider.GetValue("Name").AttemptedValue;
}  

或者Request.InputStream包含所有发布的数据,您可以根据需要读取和取消轨道:

[HttpPost]
public ActionResult Index()
{
    var serializer = new JavaScriptSerializer();
    using (var streamReader = new StreamReader(Request.InputStream))
    {
        var data = (Dictionary<string,object>)serializer
                      .DeserializeObject(streamReader.ReadToEnd());
        //assuming your posted data looks like this: '{"Name": "test"}'
        string name = data["Name"].ToString();
    }
}  

但我强烈建议您不要与 MVC 基础架构作斗争,而是将数据作为您的操作参数:

[HttpPost]
public ActionResult Index(string name)
{

}  
于 2012-09-15T06:40:39.433 回答