Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OnAction在开始操作之前执行添加到模型_C#_Asp.net Mvc 3_Modelbinders_Action Filter - Fatal编程技术网

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)
    {
    }