2011-07-08 34 views
6

Tôi không thể có danh sách lựa chọn để liên kết với ViewModel của mình.Làm cách nào để liên kết danh sách lựa chọn với chế độ xem?

Tôi có một ViewModel, trong đó có một tổ chức Câu hỏi và một chuỗi

public class QuestionViewModel 
{ 
    public Question Question { get; set; } 
    public string RefUrl { get; set; } 

    public QuestionViewModel() 
    { 
    } 

    public QuestionViewModel(Question question, string RefUrl) 
    { 
     this.Question = question; 
     this.RefUrl = RefUrl; 
    } 

    public QuestionViewModel(Question question) 
    { 
     this.Question = question; 
     this.RefUrl = ""; 
    } 
} 

này là bộ điều khiển:

public ActionResult Edit(int id) 
    { 
     Question question = db.Question.Single(q => q.question_id == id); 
     QuestionViewModel qvm = new QuestionViewModel(question); 
     ViewBag.category_id = new SelectList(db.Category, "category_id", "category_name", qvm.Question.category_id); 
     ViewBag.type_code = new SelectList(db.Question_Type, "type_code", "type_description", qvm.Question.type_code); 
     return View(qvm); 
    } 

và mã theo quan điểm của tôi trông như thế này:

<div class="editor-label"> 
     @Html.LabelFor(model => model.Question.type_code, "Question_Type") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => Model.Question.Question_Type, (SelectList)ViewBag.type_code) 
     @Html.ValidationMessageFor(model => model.Question.type_code) 
    </div> 

Chế độ xem sẽ đặt Question_Type của đối tượng Câu hỏi thành giá trị đã chọn, nhưng khi tôi gửi biểu mẫu, thứ e ValidationMessageFor triggers ??

+0

Model.Question.Question_Type Model.Question.type_code là 2 thuộc tính khác nhau? bạn có thông báo xác thực cho Question.type_code, nhưng bạn đang đặt Question_Type? –

Trả lời

14

Những gì bạn có là không phải là kiểu xem. Đây là một lớp lai mà bạn đã gọi là kiểu xem và trong đó bạn đã bao bọc thực thể miền của mình (Question). Tệ lắm, đừng làm thế.

Đây là những gì tôi muốn giới thiệu cho bạn. Bắt đầu bằng cách thiết kế một mô hình điểm thực sẽ phản ánh các yêu cầu của quan điểm của bạn (từ mô tả hiện tại của bạn đó là một DropDownList có chứa một số dạng câu hỏi và cho phép người dùng lựa chọn một số loại câu hỏi từ DDL này):

public class QuestionViewModel 
{ 
    [DisplayName("Question_Type")] 
    public string SelectedQuestionType { get; set; } 

    public IEnumerable<SelectListItem> QuestionTypes { get; set; } 

    // didn't see where you are using this on your view 
    public string RefUrl { get; set; } 
} 

sau đó có bản đồ bộ điều khiển giữa mô hình miền và mô hình chế độ xem của bạn. Tất nhiên một sự cải thiện hơn nữa sẽ được sử dụng AutoMapper để tránh lập bản đồ này trên tất cả các hành động điều khiển của bạn:

public ActionResult Edit(int id) 
{ 
    var question = db.Question.Single(q => q.question_id == id); 
    var qvm = new QuestionViewModel 
    { 
     // preselect a value 
     SelectedQuestionType = question.type_code, 
     QuestionTypes = db.Question_Type.Select(x => new SelectListItem 
     { 
      Value = x.type_code, 
      Text = x.type_description 
     }) 
    }; 
    return View(qvm); 
} 

và sau đó:

<div class="editor-label"> 
    @Html.LabelFor(x => x.SelectedQuestionType) 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(
     x => SelectedQuestionType, 
     new SelectList(Model.QuestionTypes, "Value", "Text") 
    ) 
    @Html.ValidationMessageFor(x => x.SelectedQuestionType) 
</div> 

Và một nhận xét cuối cùng: chắc chắn rằng bạn đã gạt bỏ bất kỳ ViewBag/ViewData xấu và đặt bất kỳ thứ gì mà bạn cần vào mô hình xem. Bạn đã hiển thị một số danh mục trên đó trong hành động điều khiển của bạn mà không được thực hiện trong đoạn trích xem bạn đã hiển thị. Nếu bạn cần chúng chỉ cần đặt chúng trong mô hình xem của bạn, giống như cách chúng tôi đã làm với các loại câu hỏi.

+0

Nhưng tôi cần gửi thực thể Câu hỏi đến Chế độ xem để tôi có thể chỉnh sửa nó? Bằng cách này, bạn chỉ gửi QuestionViewModel chứa Question_Type và ref_URL – Nanek

+1

@Nanek, không bạn không cần gửi bất kỳ thực thể Câu hỏi nào cho chế độ xem của mình. Như tôi đã nói, tất cả các thuộc tính mà bạn cần chỉnh sửa trong chế độ xem của bạn phải là một phần của mô hình chế độ xem của bạn. Sau đó, hành động Bài đăng của bạn sẽ có cùng một mô hình xem này và ánh xạ nó trở lại miền Mô hình câu hỏi sẽ được gửi đến kho lưu trữ để chỉnh sửa hoặc bất cứ điều gì là cần thiết. –

+0

@Darin, tại sao QuestionTypes rỗng trên bài đăng? Phương thức Post sẽ như thế nào? – mcass20

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