【发布时间】:2011-02-22 23:16:26
【问题描述】:
我使用 jquery 中的 $.ajax 方法将数据发布到肌动蛋白,使用数据字段指定要发布的数据以传递 JSON 字符串化值。
这些已发布到操作 OK,但我无法在 OnActionExecuting 操作过滤器中获取它们(它们不是 Forms 或 Params 集合的一部分)。有没有办法得到它们,如果没有,你能告诉分享为什么不吗?
【问题讨论】:
标签: asp.net-mvc json asp.net-mvc-3
我使用 jquery 中的 $.ajax 方法将数据发布到肌动蛋白,使用数据字段指定要发布的数据以传递 JSON 字符串化值。
这些已发布到操作 OK,但我无法在 OnActionExecuting 操作过滤器中获取它们(它们不是 Forms 或 Params 集合的一部分)。有没有办法得到它们,如果没有,你能告诉分享为什么不吗?
【问题讨论】:
标签: asp.net-mvc json asp.net-mvc-3
如果您的操作采用模型:
[HttpPost]
public ActionResult About(SomeViewModel model)
{
return Json(model);
}
您可以直接使用此参数值,因为 JsonValueProviderFactory 已经解析了它:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
SomeViewModel model = filterContext.ActionParameters["model"] as SomeViewModel;
}
如果没有模型(为什么没有?)你可以从请求流中读取 JSON:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
filterContext.HttpContext.Request.InputStream.Position = 0;
using (var reader = new StreamReader(filterContext.HttpContext.Request.InputStream))
{
string json = reader.ReadToEnd();
}
}
【讨论】:
Json 格式化数据的WebHook 中声明名为string jsonPayLoad = " "; 的变量而不是string json = " "; 不是很好吗?
protected override void OnActionExecuting(ActionExecutingContext ctx) {
//All my viewDto end with "viewDto" so following command is used to find them
KeyValuePair<string, object> dto = ctx.ActionParameters.FirstOrDefault(item =>
item.Key.ToLower().EndsWith("viewdto")
);
string postedData;
if (dto.Key != null) {
object viewData = dto.Value;
if (dto.Key.ToLower() == "viewdto") {
var stdStoryViewDto = dto.Value as StandardStoryViewDto;
//removing unnecessary stuff
stdStoryViewDto.Industries.Clear();
stdStoryViewDto.TimeZones.Clear();
viewData = stdStoryViewDto;
}
postedData = JsonConvert.SerializeObject(viewData);
} else {
postedData = string.Join(",",
Array.ConvertAll(ctx.ActionParameters.Keys.ToArray(),
key => key + "=" + ctx.ActionParameters[key])
);
}
}
postedData 变量包含发送到操作的 JSON 格式的数据
【讨论】: