2010-08-25 34 views
7

Tôi cố gắng để trở lại một phương pháp ViewResult trong OnActionExecuted override từ ActionFilterAttribute lớpASP.NET MVC trở ViewResult

Giống như dưới đây ...

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    if (CreateCookie && filterContext.Exception == null) 
    { 
     LoginCookies lcookie = new LoginCookies(usuDs, usuSenha); 
     lcookie.WriteCookie("SCE", 10); 
    } 
    else 
    { 
     filterContext.Result = new ViewResult() { ViewName = "Login" }; 
     filterContext.Result.ExecuteResult 
       (filterContext.Controller.ControllerContext); 
    } 

Nó hoạt động tốt trở lại một cái nhìn gọi là "Đăng nhập" , nhưng tôi cần phải vượt qua các đối tượng mô hình để xem này (trong trường hợp này đối tượng mô hình là loại người dùng) và tôi không biết làm thế nào để vượt qua nó bằng cách sử dụng ViewResult lớp trực tiếp.

Bất kỳ ý tưởng nào?

CẬP NHẬT: Tôi đã giải quyết việc thiết filterContext.ExceptionHandled TRUE vấn đề của tôi, nhưng vấn đề chính đã không được giải quyết, tôi không thể thiết lập Model tài sản của View, nó luôn luôn là null.

+0

Vui lòng hiển thị mã * không * hoạt động. – bzlm

+0

Mã này ở trên.Khi tôi trả về ViewResult Đăng nhập mã ở trên, tôi cần phải chuyển mô hình sang dạng xem, xem khác ném một ngoại lệ gây ra Mô hình là null.Problem là tôi không thể thiết lập mô hình để xem này. – ozsenegal

Trả lời

2

Tôi có thể bị nhầm lẫn, nhưng tôi tin rằng dữ liệu chế độ xem là một phần của cơ sở điều khiển và không thực sự là một phần của chính chế độ xem đó. Vì vậy, bạn sẽ có thể đặt dữ liệu chế độ xem bằng cách thực hiện như vậy:

filterContext.Controller.ViewData.Model = <your view model> 

Tôi vừa thử nghiệm và điều này làm việc cho tôi. Tôi không thấy bất cứ lý do tại sao nó không nên làm việc cho bạn:

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     TestClass1 viewModel = new TestClass1(); 

     viewModel.FirstName = "TestFilter"; 

     filterContext.Controller.ViewData.Model = viewModel; 
    } 

Referencing documentation

+0

wow, tôi nghĩ rằng nó hoạt động, nhưng không, mô hình đó luôn luôn là null trong xem – ozsenegal

+0

@ ozsenegal Trong ví dụ của bạn bạn đang ở trong sự kiện OnActionExecuted, nhưng bạn có chắc bạn đang ở trong nó trong mã thực tế của bạn? Bạn có thể truy cập vào chế độ xem của mình tại thời điểm này. – joshlrogers

+0

vâng, im chắc chắn.Xem dữ liệu được acessible theo cách bạn hiển thị, nhưng trong xem các tài sản mô hình giữ null – ozsenegal

1

lẽ điều này sẽ làm việc cho bạn:

filterContext.Result = new ViewResult { ViewName = "Exception", ViewData = new ViewDataDictionary(new CmsExceptionViewData(filterContext.Exception, action, controllerName, errorMessage)) }; 

Vì vậy ViewData được tạo ra với một ViewDataDictionary chấp nhận một từ điển hoặc một mô hình.

9

Tôi đã gặp sự cố tương tự khi Mô hình của tôi được chuyển đến Chế độ xem luôn là NULL. Tôi đã có thể chuyển Mô hình sang chế độ xem của mình với các mục sau:

Tạo chế độ xem của bạnMô hình và đặt thuộc tính. Tạo một ViewResult mới cho nó tên của View của bạn và sau đó chuyển viewModel của bạn vào ViewData.

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 

    TestViewModel viewModel = new TestViewModel; 

    //Here set all the properties of your viewModel such as your exception message 

    filterContext.Controller.ViewData.Model = viewModel; 
    filterContext.Result = new ViewResult { ViewName = "Login", ViewData = new ViewDataDictionary(viewModel)}; 
    filterContext.ExceptionHandled = true; 

}