2012-02-09 5 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' код? Вы уверены, что добавили 'атрибут' в определение класса или применимое' action'/s? – xandercoded

+0

добавлен код действия - вы говорите, что это должно работать? ... – iwayneo

+0

Та же проблема обсуждается здесь http://stackoverflow.com/questions/4766156/all-viewmodels-inherit-from-baseviewmodel-can-i-set -this-up-in-onactionexecut –

ответ

7

Controller.ViewData.Model не заселять параметры действий в ASP.NET MVC. Это свойство используется для передачи данных из действия для просмотра.

Если по каким-то причинам вы не хотите использовать пользовательские модели Binder (который является стандартом, способ рекомендованы заселение параметров действий в asp.net-MVC), вы могли бы вы ActionExecutingContext.ActionParameters Property

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

Мне очень не нравится это признавать, но для других, совершающих ту же ошибку: я действительно начал использовать этот метод, и когда я добавил атрибут к другому действию, он прекратил работать. причина? Я назвал свой «ввод» в этом действии! У меня теперь есть чек и бросок, если атрибут добавлен к действию с неправильно названной моделью :) – iwayneo

+0

@iwayneo почему бы вам не использовать пользовательскую модель Binder? – archil

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

И THATS ЭТО ..... проголосуйте ЕСЛИ ВЫ ЛЮБИТЕ ОТВЕТ

Смежные вопросы