2012-02-09 34 views
9

之前型號我有以下幾點:OnActionExecuting添加越來越行動

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

你也可以上傳你的'Controller'代碼?你確定你已經將'attribute'添加到'class'定義或適用的'action'/s? – xandercoded 2012-02-09 17:10:09

+0

添加動作代碼 - 你是說這應該工作嗎?... – iwayneo 2012-02-09 17:12:30

+0

同樣的問題在這裏討論http://stackoverflow.com/questions/4766156/all-viewmodels-inherit-from-baseviewmodel-can-i-set -this-in-onactionexecut – 2012-02-09 17:19:17

回答

7

Controller.ViewData.Model未在asp.net MVC填充動作參數。該屬性用於將數據從操作傳遞到查看。

如果由於某種原因,你不想使用自定義的模型綁定(這是標準的,在asp.net-MVC填充作用參數reccommended方式),你可能在你ActionExecutingContext.ActionParameters Property

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.ActionParameters["model"] = new BaseViewModel(); 
     // etc 
    } 
+1

我真的很討厭承認它,但對於其他人犯了同樣的錯誤:我實際上開始使用這種方法,當我將該屬性添加到另一個動作時,它停止工作。原因?我已經爲這個動作命名了我的模型「輸入」!我現在有一個檢查和拋出,如果屬性被添加到一個錯誤地命名模型的動作:) – iwayneo 2012-02-10 10:43:58

+0

@iwayneo爲什麼不使用自定義模型綁定器? – archil 2012-02-10 11:45:29

2

有點晚對於答覆,但對其他人有用。我們可以通過修飾我們的屬性來獲得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) 
    { 
    } 

和那IT .....請投票,如果你喜歡的答案