2012-02-09 26 views
9

Tôi đã điều sau đây:OnActionExecuting thêm vào mô hình trước khi hành động

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(); 
    } 

Bây giờ bước qua mà tôi có thể nhìn thấy người sử dụng và Đề án mô hình đang được dân cư.

Bởi thời gian tôi nhận được hành động, tuy nhiên cả hai đều là null?

Tôi đang làm gì sai ở đây?

Và thêm vào đây, đây có phải là cách thích hợp để thêm vào mô hình không?

Đây là mã điều khiển:

[InjectStandardReportInputModel] 
public ActionResult Header(BaseViewModel model) 
{ 
    //by this point model.Scheme is null!! 

} 
+0

Ông có thể cũng gửi 'Controller' mã của bạn? Bạn chắc chắn bạn đã thêm 'attribute' vào định nghĩa' class' hoặc 'action'/s áp dụng được? – xandercoded

+0

đã thêm mã hành động - bạn có đang nói điều này sẽ hoạt động không? ... – iwayneo

+0

Vấn đề tương tự được thảo luận tại đây http://stackoverflow.com/questions/4766156/all-viewmodels-inherit-from-baseviewmodel-can-i-set -i-up-in-onactionexecut –

Trả lời

7

Controller.ViewData.Model không được đưa thông số hành động trong asp.net MVC. Thuộc tính đó được sử dụng để truyền dữ liệu từ hành động để xem.

Nếu vì một số lý do bạn không muốn sử dụng custom Model Binder (đó là tiêu chuẩn, cách reccommended của Populating thông số hành động trong asp.net-MVC), bạn có thể bạn ActionExecutingContext.ActionParameters Property

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

tôi thực sự ghét phải thừa nhận nó, nhưng đối với những người khác làm cho cùng một sai lầm: Tôi thực sự bắt đầu bằng cách sử dụng phương pháp này, và khi tôi thêm các thuộc tính cho hành động khác nó ngừng hoạt động. nguyên nhân? Tôi đã đặt tên cho mô hình "đầu vào" của tôi trên hành động này! bây giờ tôi có một kiểm tra và ném nếu thuộc tính được thêm vào một hành động với một mô hình được đặt tên không chính xác :) – iwayneo

+0

@ iwayneo tại sao bạn không sử dụng tùy chỉnh Model Binder? – archil

2

Bit cuối cho câu trả lời nhưng nó sẽ hữu ích cho người khác. chúng ta có thể nhận được giá trị của mô hình trong OnActionExecuting bằng cách chỉ trang trí thuộc tính của chúng ta thêm một chút nữa.

NÀY LÀ LỌC CỦA CHÚNG TÔI CLASS

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

và thats nó ..... hãy bỏ phiếu nếu bạn thích ĐÁP

Các vấn đề liên quan