我有以下内容:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
var model = filterContext.Controller.ViewData.Model as BaseViewModel;
if (model == null)
{
model = new BaseViewModel();
filterContext.Controller.ViewData.Model = model;
}
model.User = (UserPrincipal)filterContext.HttpContext.User;
model.Scheme = GetScheme();
}
现在逐步完成我可以看到模型上的用户和方案正在填充。
当我开始行动时,它们都是空的?
我在这里做错了什么?
除此之外,这是添加到模型的正确方法吗?
这是控制器代码:
[InjectStandardReportInputModel]
public ActionResult Header(BaseViewModel model)
{
//by this point model.Scheme is null!!
}
答案 0 :(得分:7)
Controller.ViewData.Model
未在asp.net mvc中填充操作参数。该属性用于将数据从操作传递到视图。
如果由于某种原因你不想使用自定义Model Binder(这是在asp.net-mvc中填充动作参数的标准的,推荐的方式),你可以ActionExecutingContext.ActionParameters Property
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.ActionParameters["model"] = new BaseViewModel();
// etc
}
答案 1 :(得分:1)
回复迟到但对其他人有用。我们可以通过稍微装饰我们的属性来获取OnActionExecuting中模型的值。
这是我们的过滤器类
public sealed class TEST: ActionFilterAttribute
{
/// <summary>
/// Model variable getting passed into action method
/// </summary>
public string ModelName { get; set; }
/// <summary>
/// Empty Contructor
/// </summary>
public TEST()
{
}
/// <summary>
/// This is to get the model value by variable name passsed in Action method
/// </summary>
/// <param name="modelName">Model variable getting passed into action method</param>
public TEST(string modelName)
{
this.ModelName = modelName;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var result = filterContext.ActionParameters.SingleOrDefault(ap => ap.Key.ToLower() == ModelName.ToString()).Value;
}
}
THIS IS OUR ACTION METHOD PLEASE NOTE model variable has to be same
[HttpPost]
[TEST(ModelName = "model")]
public ActionResult TESTACTION(TESTMODEL model)
{
}
这就是.....如果你喜欢这个答案,请投票