2010-05-01 11 views
9

Khi tôi làm quen với Asp.Net MVC, tôi đang sử dụng MVC 2, tôi đã nhận thấy việc sử dụng lớp BaseViewData trong dự án Kigg mà tôi không chắc chắn cách triển khai thực hiện.Cách sử dụng Base ViewModel trong Asp.net MVC 2

Tôi muốn mỗi Chế độ xem của mình có các giá trị nhất định có sẵn. Sử dụng một iterface đến tâm trí nhưng tôi tự hỏi thực hành tốt nhất là gì và làm thế nào để Kigg làm điều đó?

Kigg

public abstract class BaseViewData 
{ 
    public string SiteTitle { get; set; } 
    // ...other properties 
} 
public class UserListViewData : BaseViewData 
{ 
    public string Title { get; set; } 
    // .. other stuff 
} 

Trong ứng dụng WebForms tôi sử dụng một BasePage được thừa kế từ System.Web.UI.Page.
Vì vậy, trong dự án MVC của tôi, tôi có điều này:

public abstract class BaseViewModel 
{ 
    public int SiteId { get; set; } 
} 
public class UserViewModel : BaseViewModel 
{ 
    // Some arbitrary ViewModel 
} 
public abstract class BaseController : Controller 
{ 
    private IUserRepository _userRepository; 

    protected BaseController() 
     : this(
      new UserRepository()) 
    { 
    } 
} 

Tham khảo phương pháp Kigg, làm thế nào để đảm bảo rằng mỗi người trong ViewModel của tôi được thừa kế từ BaseViewModel có tài sản SiteID?

Thực hành, mẫu hoặc mẫu tốt nhất tôi nên sử dụng là gì?

Trả lời

13

Cách tiếp cận mà tôi sẽ thực hiện là sử dụng bộ điều khiển cơ sở và sử dụng ghi đè OnActionExecuted để điền mô hình của bạn với dữ liệu chung. Sau đó, hãy đảm bảo rằng bộ điều khiển của bạn kế thừa từ bộ điều khiển cơ sở và mô hình của bạn kế thừa từ mô hình cơ sở.

public class BaseController : Controller 
{ 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var result = filterContext.Result as ViewResult; 
     if (result != null) 
     { 
      var baseModel = result.Model as BaseViewModel; 
      if (baseModel != null) 
      { 
       baseModel.SiteID = ... 
      } 
     } 
    } 
} 
+0

Bạn sẽ phải đúc bối cảnh bộ lọc để sử dụng nó như thế này: '((ViewResult) filterContext.Result) .ViewData.Model' – ajbeaven

+0

Nhìn vào mã của tôi, tôi thực sự lưu kết quả trong một biến địa phương chuyển sang ViewResult bằng cách sử dụng 'as', sau đó kiểm tra null. – tvanfosson