Nói tóm lại tôi muốn để có thể vượt qua một ViewModel chung vào quan điểm của tôiMVC generic ViewModel
Dưới đây là một số mã đơn giản của các ý chính của những gì tôi đang cố gắng để đạt
public interface IPerson
{
string FirstName {get;}
string LastName {get;}
}
public class FakePerson : IPerson
{
public FakePerson()
{
FirstName = "Foo";
LastName = "Bar";
}
public string FirstName {get; private set;}
public string LastName {get; private set;}
}
public class HomeViewModel<T>
where T : IPerson, new()
{
public string SomeOtherProperty{ get; set;}
public T Person { get; private set; }
public HomeViewModel()
{
Person = new T();
}
}
public class HomeController : Controller {
public ViewResult Index() {
return View(new HomeViewModel<FakePerson>());
}
}
Nếu tôi tạo chế độ xem của tôi như sau tất cả các công trình như mong đợi
<%@ Page Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<HomeViewModel<FakePerson>>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<%: Html.DisplayFor(m=>m.Person.FirstName) %>
<%: Html.DisplayFor(m=>m.Person.LastName) %>
</asp:Content>
Tuy nhiên tôi không muốn phụ thuộc trực tiếp vào FakePerson trong trường hợp tôi muốn chuyển một số triển khai IPerson khác, vì vậy tôi đã cố gắng thay đổi chỉ thị trang thành
<%@ Page Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<HomeViewModel<IPerson>>" %>
Nhưng tất nhiên điều đó không hiệu quả, vì vậy, sau cả ngày mút, tôi có mái tóc màu xám hơn và không biết phải làm gì tiếp theo.
Ai đó có thể giúp bạn.
[CẬP NHẬT]
Một số tư vấn đã sugested rằng tôi nên sử dụng giao diện covariant; xác định một giao diện không chung chung và sử dụng nó trong khung nhìn. Không may là tôi đã thử điều này nhưng có một hàm ý về mặt quảng cáo. Tôi muốn các chức năng HtmlHelper để có thể truy cập vào bất kỳ thuộc tính dữ liệu chú thích có thể được định nghĩa trong lớp IPerson có nguồn gốc
public class FakePerson : IPerson
{
public FakePerson()
{
FirstName = "Foo";
LastName = "Bar";
}
[DisplayName("First Name")]
public string FirstName {get; private set;}
[DisplayName("Last Name")]
public string LastName {get; private set;}
}
Vì vậy, khi sử dụng một giao diện hiệp biến cách này không làm việc, một phần, để truy cập vào loại có nguồn gốc qua ViewModel; vì khung nhìn được gõ vào giao diện, nó xuất hiện các thuộc tính không thể truy cập được.
Có cách nào đó, theo quan điểm, để có quyền truy cập vào các thuộc tính này, có thể có sự phản ánh. Hoặc có thể có một cách khác để nhập Chế độ xem vào chung chung.
Làm thế nào bạn có thể mong đợi xem của bạn để truy cập nguồn gốc dữ liệu, nhưng bạn không muốn làm cho nó phụ thuộc vào dữ liệu có nguồn gốc? Đặt một cách khác, nếu bạn truy cập dữ liệu duy nhất cho FakePerson, thì chế độ xem của bạn phụ thuộc vào FakePerson và như vậy bạn nên làm cho mô hình của mình là FakePerson. Nếu bạn vượt qua trong một số đối tượng khác, sau đó nó sẽ có lỗi khi truy cập FakePerson. –
Bạn không thể sử dụng chú thích dữ liệu với giao diện, vì thuộc tính không được kế thừa (xem http://stackoverflow.com/questions/540749/can-ac-sharp-class-inherit-attributes-from-its-interface) –