2012-12-22 40 views
7

Có cách nào để xử lý điều này mà không cần tùy chỉnh Mô hình ràng buộc?ASP.NET MVC 4 ViewModel Với giao diện trẻ em

public class MyViewModel { 
    public string UserId { get; set; } 
    public IJob Job { get; set; } 
} 

public interface IJob { 
    public long Id { get; set; } 
    public string CompanyName { get; set; } 
} 

public class FullTimeJob : IJob { 
    // omitted for brevity 
} 

public class Internship : IJob { 
    // omitted for brevity 
} 

Vấn đề tôi gặp phải là tôi gặp lỗi trong trình kết nối mô hình mặc định vì không hiểu được việc triển khai IJob nào để khởi tạo. Khi tạo MyViewModel, tôi thiết lập một thể hiện của FullTimeJob vào thuộc tính Job của nó. Tôi đoán ASP.NET không thể giữ lại các loại thực hiện?

Giải pháp thực hành tốt nhất cho việc này là gì?

Trả lời

1

Chế độ xem chỉ là các mạng di động giữa giao diện người dùng và bộ điều khiển. Vì vậy, bạn có thể chỉ cần thêm thuộc tính Id và CompanyName vào chế độ xem của mình. Bởi vì tất cả những gì bạn muốn làm là lấy Id và giá trị của công ty từ giao diện người dùng. Nó có thể không quan trọng cho dù đó là một thực tập hoặc công việc toàn thời gian trong khi nhận được dữ liệu từ giao diện người dùng. Điều này có thể quan trọng khi bạn xử lý dữ liệu bạn nhận được từ giao diện người dùng nhưng không phải là trách nhiệm của View.

+0

Tôi muốn có thể duy trì thứ bậc đối tượng, vì vậy tôi chắc chắn muốn * tránh * đặt các trường liên quan đến công việc trực tiếp lên mô hình chế độ xem. Nếu tôi làm điều đó, ViewModel sẽ không mua cho tôi bất cứ thứ gì. –

+0

Vâng, tôi đã làm điều đó trong một mô hình tùy chỉnh chất kết dính, nhưng tôi đã chỉ hy vọng sẽ có một câu trả lời ít tùy chỉnh. –

+0

Bạn có thể làm cho ViewModel giống như 'class MyViewModel trong đó T: IJob, new()' và trong hàm khởi tạo bạn có thể khởi tạo Job Type 'Job = new T();' nhưng nó vẫn phụ thuộc vào kiểu Job cụ thể. –

0

Một lựa chọn, mặc dù không đặc biệt thanh lịch, có thể là như sau:

public class MyViewModel { 
    public string UserId { get; set; } 
    public FulltimeJob FulltimeJob { get; set; } 
    public InternJob InternJob { get; set; } 

    public IJob Job { get { return FulltimeJob ?? InternJob; } } 
} 

này giúp bạn dễ dàng truy cập vào các tính chất chia sẻ qua các tài sản công việc, trong khi duy trì quyền truy cập vào bất kỳ thuộc tính đẳng cấp cụ thể.

Sau đó, bạn có thể kiểm tra thuộc tính nào được điền trong các phương thức của trình điều khiển POST và hành động tương ứng.

+0

Đó là một ý tưởng gọn gàng cho một giải pháp, và tôi thấy bạn đang đi đến đó với điều đó, mặc dù vấn đề là bất cứ lúc nào tôi thêm một triển khai mới của IJob (trong đó tôi đã có 6), tôi phải sửa đổi lớp này. Sẽ không quá tệ nếu hai trường phụ bạn thêm vào trong bản đồ hoặc bộ sưu tập, nhưng nó vẫn cảm thấy hơi khó chịu. –

+0

Tôi đồng ý; Tôi đoán nó đi xuống để làm thế nào tương tự như các lớp học được và cho dù bạn thực sự cần được chia sẻ quan điểm và phương pháp điều khiển cho họ. Một tuyến đường khác (mặc dù tương tự) là làm phẳng mô hình khung nhìn và chỉ bao gồm các trường (liên kết tất cả các trường từ tất cả các lớp công việc của bạn) cũng như một JobType để cho bạn biết trong bộ điều khiển những trường nào có thể được mong đợi. Sử dụng AutoMapper hoặc Fasterflect để đơn giản hóa/tự động hóa ánh xạ thuộc tính để làm cho việc này dễ dàng hơn một chút. –