mvc的action中如何获取ajax post过来的数据?Request Payload

hchloveit01 2015-06-19 03:11:04
我网上下载的demo,在action中可以获取到前端post过来的数据


但是,怎么在我的mvc2程序中获取不到啊?
...全文
3068 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
跳动de指尖 2015-06-23
  • 打赏
  • 举报
回复
xhr不要设置Request Payload
老李家的小二 2015-06-23
  • 打赏
  • 举报
回复
mark
Zhaokf1991 2015-06-22
  • 打赏
  • 举报
回复
楼主下载的是什么Demo,可以分享吗
newtee 2015-06-21
  • 打赏
  • 举报
回复
上面看错了 mvc1里面也不支持payload那种类型
newtee 2015-06-21
  • 打赏
  • 举报
回复
楼主可以在请求时候设置一下 Content-Type 为application/x-www-form-urlencoded
__岑__ 2015-06-21
  • 打赏
  • 举报
回复
request paylaod确实在2里面不支持
newtee 2015-06-21
  • 打赏
  • 举报
回复

ControllerActionInvoker里面的
protected virtual object GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) {
// collect all of the necessary binding properties
Type parameterType = parameterDescriptor.ParameterType;
IModelBinder binder = GetModelBinder(parameterDescriptor);
IDictionary<string, ValueProviderResult> valueProvider = controllerContext.Controller.ValueProvider;
string parameterName = parameterDescriptor.BindingInfo.Prefix ?? parameterDescriptor.ParameterName;
Predicate<string> propertyFilter = GetPropertyFilter(parameterDescriptor);

// finally, call into the binder
ModelBindingContext bindingContext = new ModelBindingContext() {
FallbackToEmptyPrefix = (parameterDescriptor.BindingInfo.Prefix == null), // only fall back if prefix not specified
ModelName = parameterName,
ModelState = controllerContext.Controller.ViewData.ModelState,
ModelType = parameterType,
PropertyFilter = propertyFilter,
ValueProvider = valueProvider
};
object result = binder.BindModel(controllerContext, bindingContext);
return result;
}
newtee 2015-06-21
  • 打赏
  • 举报
回复
刚刚试了下 mvc1.0版本都是可以的
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(string test)
{
return Json(test);
}

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<div>
test
</div>
<input type="text" name="test" id="test"/>
<button id="sub">post test</button>
<script src="../../Scripts/jquery-1.7.1.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#sub").click(function () {
var test = $("#test").val();
$.ajax({
type: "post",
url: "/home/index",
data: { "test": test },
dataType: 'json',
success: function (msg) {
console.log(msg);
}
})
})
})
</script>
</body>
</html>
newtee 2015-06-21
  • 打赏
  • 举报
回复
参考:
http://www.cnblogs.com/artech/archive/2012/05/23/default-model-binding-01.html
http://bbs.csdn.net/topics/390536619
newtee 2015-06-21
  • 打赏
  • 举报
回复
不然action方法参数没法解析
newtee 2015-06-21
  • 打赏
  • 举报
回复
楼主用mvc 2的话 设置一下 Content-Type 为application/x-www-form-urlencoded

千万别用 Content-Type :application/json
不然action方法没法解析
newtee 2015-06-21
  • 打赏
  • 举报
回复
翻了源码看下是mvc2里面不支持解析contentType:application/json导致的

mvc2 里面的 ValueProvider
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly",
Justification = "This property is settable so that unit tests can provide mock implementations.")]
public IDictionary<string, ValueProviderResult> ValueProvider {
get {
if (_valueProvider == null) {
_valueProvider = new ValueProviderDictionary(ControllerContext);
}
return _valueProvider;
}
set {
_valueProvider = value;
}
}

mvc3里的ValueProvider
public IValueProvider ValueProvider {
get {
if (_valueProvider == null) {
_valueProvider = ValueProviderFactories.Factories.GetValueProvider(ControllerContext);
}
return _valueProvider;
}
set {
_valueProvider = value;
}
}

public static class ValueProviderFactories {

private static readonly ValueProviderFactoryCollection _factories = new ValueProviderFactoryCollection() {
new ChildActionValueProviderFactory(),
new FormValueProviderFactory(),
new JsonValueProviderFactory(),
new RouteDataValueProviderFactory(),
new QueryStringValueProviderFactory(),
new HttpFileCollectionValueProviderFactory(),
};

public static ValueProviderFactoryCollection Factories {
get {
return _factories;
}
}

}
mvc3里面支持各种ValueProvider

其中JsonValueProviderFactory里面支持了contentType:application/json


private static object GetDeserializedObject(ControllerContext controllerContext) {
if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) {
// not JSON request
return null;
}

StreamReader reader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
string bodyText = reader.ReadToEnd();
if (String.IsNullOrEmpty(bodyText)) {
// no JSON data
return null;
}

JavaScriptSerializer serializer = new JavaScriptSerializer();
object jsonData = serializer.DeserializeObject(bodyText);
return jsonData;
}

public override IValueProvider GetValueProvider(ControllerContext controllerContext) {
if (controllerContext == null) {
throw new ArgumentNullException("controllerContext");
}

object jsonData = GetDeserializedObject(controllerContext);
if (jsonData == null) {
return null;
}

Dictionary<string, object> backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
AddToBackingStore(backingStore, String.Empty, jsonData);
return new DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture);
}
__岑__ 2015-06-21
  • 打赏
  • 举报
回复
楼主可以在请求时候设置一下 Content-Type 为application/x-www-form-urlencoded 这样做
newtee 2015-06-21
  • 打赏
  • 举报
回复
晚上又看了下 其实不是Mvc问题 你那样mvc4照样不支持 那些在request.form是取不到的 mvc中request.form是system.web提供的 不知道楼主payload情况是怎么产生的

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧