2009-04-19 38 views
8

Tôi đã một ViewModel tùy chỉnh định nghĩa là:MVC Tuỳ chỉnh ViewModel và ràng buộc tự động

public class SampleFormViewModel 
{ 
    public SampleFormViewModel(SelectList companies, Widget widget) 
    { 
     Companies = companies; 
     Widget = widget; 
    } 

    public SelectList Companies { get; private set; } 
    public Widget Widget { get; private set; } 
} 

Trong handler Sửa POST của tôi, tôi có các mục sau đây:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(SampleFormViewModel model) 
{ 

dạng Chỉnh sửa được thiết lập như:

Inherits="System.Web.Mvc.ViewPage<Sample.Web.Models.SampleFormViewModel>" 

Và nó chỉ thổi lên, không chắc chắn những gì đang xảy ra, có lỗi sau: Không có p constructor không có tham số được định nghĩa cho đối tượng này. Chắc chắn tôi đang thiếu điều gì đó thực sự rõ ràng ở đây. Một số nền, GET hoạt động hoàn hảo và hiển thị menu thả xuống từ SelectList như mong đợi. Tôi đoán tự động ràng buộc trở lại mô hình chế độ xem tùy chỉnh là những gì không thành công nhưng không chắc chắn phải làm gì với nó.

+0

Biểu mẫu bạn đăng là gì? –

Trả lời

8

Bạn cần có một hàm tạo tham số và tôi tin rằng các thuộc tính cần phải có trình cài đặt công khai. Trình kết nối mặc định tạo đối tượng bằng cách sử dụng một hàm tạo không có tham số, sau đó sử dụng sự phản chiếu trên các thuộc tính công khai để đặt các giá trị từ các tham số biểu mẫu/truy vấn.

public class SampleFormViewModel 
{ 
    public SampleFormViewModel() { } 

    public SelectList Companies { get; set; } 
    public Widget Widget { get; set; } 
} 

Tôi nghi ngờ rằng, điều bạn thực sự muốn làm là không có mô hình khung, nhưng mô hình Widget cơ bản và chọn giá trị danh sách trên biểu mẫu. Tôi không nghĩ rằng các chất kết dính sẽ có thể tái tạo một SelectList trên bài vì nó chỉ có giá trị được lựa chọn trong các tham số.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int CompanyID, Widget widget) 
{ 
} 
+0

Vâng, tôi hiểu ngay bây giờ. Vấn đề là SelectList không có các hàm tạo tham số. Nếu tôi loại bỏ các SelectList (công ty) từ các nhà xây dựng. Và xây dựng nó trên bay (từ thông tin trong đối tượng widget) khi tôi tạo ViewModel tất cả hoạt động như mong đợi. Chỉ có sự khác biệt là cách tôi xử lý nó trong POST, chữ ký bây giờ là: action ActionResult Edit (int id, FormCollection formValues) –

2

MVC yêu cầu, trên chế độ xem mạnh mẽ, chế độ xem có thể tạo lớp được sử dụng trên chế độ xem đó. Điều này có nghĩa là một hàm tạo không có tham số nào. Và điều này có ý nghĩa. Những người mới tham gia MVC sẽ thấy tương tự "huh?" các vấn đề khi họ quên/không thực hiện các tham số công khai và tất cả các lỗi liên quan đó xuất hiện khi khung nhìn cố gắng đặt chính nó lại với nhau (trái ngược với lỗi trình biên dịch).

Nhưng điều gì là "thú vị" trong lớp này của các vấn đề về hàm tạo tham số là khi một thuộc tính của lớp của bạn cũng KHÔNG có hàm tạo miễn phí. Tôi đoán đây là cách tiếp cận bi quan?

Đã dành một số thời gian học tập trên lớp SelectList - một lớp học cụ thể cho MVC - Tôi muốn hy vọng giúp một số người tiết kiệm một vài phút/giờ.

này công cụ thực sự quan trọng/lớp để tạo danh sách thả xuống, có các nhà thầu sau:

SelectList công cộng (mục IEnumerable); SelectList công khai (mục IEnumerable, đối tượng selectedValue); SelectList công khai (các mục IEnumerable, chuỗi dataValueField, string dataTextField); SelectList công khai (các mục IEnumerable, chuỗi dataValueField, string dataTextField, object selectedValue);

..và do đó, nếu đây là các thuộc tính trong lớp của bạn (lớp được sử dụng cho chế độ xem), MVC sẽ cung cấp cho bạn khó nắm bắt lỗi "Không có hàm tạo tham số". NHƯNG, nếu bạn tạo một cái gì đó giống như một lớp trợ giúp, hãy cắt-dán chính xác mã từ lớp ban đầu của bạn, và sau đó làm cho lớp trợ giúp đó tham số (KHÔNG là tập hợp/nhận) trên lớp ban đầu của bạn; bạn tốt để đi.

Và theo cách này, bạn có thể sử dụng một chế độ xem duy nhất để nhận và gửi bài đăng.Đó là đẹp hơn :)

Cá nhân, tôi đã tạo trình biên dịch để nhận ra các liên kết và yêu cầu của chế độ xem được nhập mạnh mẽ hoặc để trình đơn thả xuống (hoặc "khách hàng" khác của SelectList) không hoạt động sau đó tự hỏi nếu có một mức độ cụ thể của kiểm tra đệ quy trên các nhà thầu paramerterless.

Rất may, phiên bản hiện tại dường như chỉ là cấp cao nhất. Cảm thấy như một hack và tôi hy vọng nó bằng thiết kế.

HTH.

+1

Bạn có thể xây dựng câu lệnh về lớp trợ giúp cho các danh sách được chọn không ?, có lẽ với một ví dụ mã? – camainc

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