C# OnAction在开始操作之前执行添加到模型
我有以下资料:C# OnAction在开始操作之前执行添加到模型,c#,asp.net-mvc-3,modelbinders,action-filter,C#,Asp.net Mvc 3,Modelbinders,Action Filter,我有以下资料: public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); if (filterContext == null) { throw new ArgumentNullException("filterContext");
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!!
}
Controller.ViewData.Model
未在asp.net mvc中填充操作参数。该属性用于将数据从操作传递到视图
如果出于某种原因,您不想使用自定义模型绑定器(这是在asp.NETMVC中填充操作参数的标准、推荐的方法),您可以
回复有点晚,但对其他人来说会很有用。我们只需稍微修饰一下属性,就可以在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)
{
}
公共密封类测试:ActionFilterAttribute
{
///
///将模型变量传递到action方法
///
公共字符串ModelName{get;set;}
///
///空构造函数
///
公开考试()
{
}
///
///这是通过在Action方法中传递变量名来获取模型值
///
///将模型变量传递到action方法
公共测试(字符串模型名)
{
this.ModelName=ModelName;
}
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
var result=filterContext.ActionParameters.SingleOrDefault(ap=>ap.Key.ToLower()==ModelName.ToString()).Value;
}
}
这是我们的操作方法,请注意模型变量必须相同
[HttpPost]
[测试(ModelName=“model”)]
公共操作结果测试操作(测试模型)
{
}
就这样……如果你喜欢答案,请投票你也可以发布你的
控制器
代码吗?你确定你已经将属性
添加到类
定义或适用的操作
/s?添加了操作代码-你是说这应该有效吗?…这里讨论了同样的问题,我真的很不愿意承认,但其他人也犯了同样的错误:我实际上开始使用这种方法,当我将属性添加到另一个操作时,它停止工作。原因是什么?我已经将我的模型命名为“输入”了!我现在有一个检查并抛出,如果属性被添加到一个命名错误的模型的操作:)@iwayno为什么不使用自定义模型绑定器?
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)
{
}