2010-10-25 25 views
13

Tôi đang tìm phương pháp tốt nhất để tạo một trình soạn thảo danh sách thả xuống mẫu với MVC. Dường như có nhiều phương pháp khác nhau nhưng tôi không thể tìm ra phương pháp nào tốt nhất, mọi người dường như làm điều đó khác đi. Tôi đang sử dụng MVC3 với Razor là tốt, do đó, một phương pháp làm việc với điều này là ưa thích.ASP.NET MVC DropDown Editor Template

Trả lời

20

Có nhiều cách và nói điều tốt nhất sẽ là chủ quan và có thể không hoạt động trong kịch bản của bạn mà theo cách bạn quên mô tả trong câu hỏi của mình. Đây là cách tôi làm điều đó:

mẫu:

public class MyViewModel 
{ 
    public string SelectedItem { get; set; } 
    public IEnumerable<Item> Items { get; set; } 
} 

public class Item 
{ 
    public string Value { get; set; } 
    public string Text { get; set; } 
} 

Bộ điều khiển:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      // TODO: Fetch this from a repository 
      Items = new[] 
      { 
       new Item { Value = "1", Text = "item 1" }, 
       new Item { Value = "2", Text = "item 2" }, 
       new Item { Value = "3", Text = "item 3" }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // redisplay the view to fix validation errors 
      return View(model); 
     } 

     // TODO: The model is valid here => 
     // perform some action using the model.SelectedItem 
     // and redirect to a success page informing the user 
     // that everything went fine 
     return RedirectToAction("Success"); 
    } 
} 

View (~/Views/Home/Index.cshtml):

@model MyApp.Models.MyViewModel 

@{ Html.BeginForm(); } 
    @Html.EditorForModel() 
    <input type="submit" value="OK" /> 
@{ Html.EndForm(); } 

biên tập mẫu (~/Views/Home/EditorTemplates/MyViewModel.cshtml):

@model MyApp.Models.MyViewModel 

@Html.DropDownListFor(x => x.SelectedItem, 
    new SelectList(Model.Items, "Value", "Text")) 
+0

Cảm ơn cho điều này, nó có vẻ là chính xác những gì tôi muốn. – Craig

+1

Cảm ơn Darin. Nhưng mẫu trình soạn thảo chỉ có một taks (trình đơn thả xuống). Làm thế nào bạn có thể chỉ cần gọi EditotFormModel()? Điều gì xảy ra nếu tôi cần có hai mẫu trình chỉnh sửa? Một cho trình đơn thả xuống và một cho danh sách hộp kiểm? cả hai tôi muốn sử dụng int ông cùng xem? – Shyju

1

Cá nhân tôi nghĩ rằng các mục danh sách phải được đặt trong dữ liệu chế độ xem chứ không phải kiểu xem nhưng nó thực sự phụ thuộc nếu bạn đang hiển thị trình đơn thả xuống không bao giờ thay đổi (sử dụng dữ liệu chế độ xem) hoặc nếu bạn phải sửa đổi (sử dụng mô hình xem).

Trong ví dụ bạn đang đăng cùng một kiểu xem cho hành động chỉ mục. Hành động chỉ mục chỉ quan tâm đến mục đã chọn để chỉ có thể thay đổi tham số của hành động đăng chỉ mục thành chuỗi selectedItem. Bằng cách đó, trình mô hình hóa sẽ xem xét các tham số biểu mẫu và điền thông số chỉ mục cho bạn.

Ngoài ra, tôi nghĩ sẽ tốt hơn khi chuyển danh sách SelectedListItems xuống chế độ xem theo cách đó bạn sẽ không cần bất kỳ sự hội tụ nào và không cần lớp Item.

4

Đây là cách tiếp cận của tôi từ bài đăng này:

One EditorTemplate for all DropDownLists in ASP.Net MVC

+0

Tôi thích giải pháp này, nhưng nó có thể DI'd lên một chút, giống như sử dụng 'DependencyResolver' thay vì' Activator' để nhanh chóng –

+0

Thực ra tôi đã thực hiện nhiều cải tiến nhưng tôi cảm thấy quá lười biếng để cập nhật bài viết :) Tôi sẽ làm một cái mới sau đó tôi đã nói với bạn :) –