6

Tôi đang sử dụng Bộ lọc hành động trong MVC 3.Thay đổi mô hình trong sự kiện OnActionExecuting

Câu hỏi của tôi là nếu tôi có thể tạo mô hình trước khi nó được chuyển đến ActionResult trong sự kiện OnActionExecuting?

Tôi cần thay đổi một trong các giá trị thuộc tính tại đó.

Cảm ơn bạn,

+0

Bạn có thể giải thích lý do tại sao bạn cần thực hiện việc này không? Tôi nghi ngờ có một cách tốt hơn để thực hiện những gì bạn cần. – DMulligan

+0

Một trong các thuộc tính mô hình xác định cách hiển thị của giao diện: Trình chỉnh sửa hoặc Hiển thị và tôi muốn đặt chế độ xem theo quyền của người dùng –

+0

tại sao bạn muốn giữ nội dung như thế này phụ thuộc vào thuộc tính mô hình. thay vào đó, bạn nên kiểm tra quyền người dùng bên trong khung nhìn và quyết định mẫu sẽ hiển thị (trình soạn thảo hoặc hiển thị) –

Trả lời

24

Chưa có mô hình nào trong sự kiện OnActionExecuting. Mô hình được trả về bởi hành động của bộ điều khiển. Vì vậy, bạn có một mô hình bên trong sự kiện OnActionExecuted. Đó là nơi bạn có thể thay đổi giá trị. Ví dụ, nếu chúng ta giả định rằng hành động điều khiển của bạn trở lại một ViewResult và thông qua nó một số mô hình dưới đây là cách bạn có thể lấy mô hình này và sửa đổi một số tài sản:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var result = filterContext.Result as ViewResultBase; 
     if (result == null) 
     { 
      // The controller action didn't return a view result 
      // => no need to continue any further 
      return; 
     } 

     var model = result.Model as MyViewModel; 
     if (model == null) 
     { 
      // there's no model or the model was not of the expected type 
      // => no need to continue any further 
      return; 
     } 

     // modify some property value 
     model.Foo = "bar"; 
    } 
} 

Nếu bạn muốn thay đổi giá trị của một số tài sản của mô hình điểm đó là thông qua đối số hành động sau đó tôi sẽ khuyên bạn nên làm điều này trong một chất kết dính mô hình tùy chỉnh. Nhưng cũng có thể đạt được điều đó trong sự kiện OnActionExecuting:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var model = filterContext.ActionParameters["model"] as MyViewModel; 
     if (model == null) 
     { 
      // The action didn't have an argument called "model" or this argument 
      // wasn't of the expected type => no need to continue any further 
      return; 
     } 

     // modify some property value 
     model.Foo = "bar"; 
    } 
} 
+1

Cảm ơn bạn, thực sự hữu ích! –

+0

Hi, bạn có thể biết làm thế nào tôi có thể nhận được các thông số của hành động được thông qua như ActionDescriptor.ActionParameters trong sự kiện OnActionExecuting? –

+0

Đó là những gì tôi đã cho thấy trong câu trả lời của tôi: 'filterContext.ActionParameters [" parameterName "]'. –

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