2010-10-25 156 views
13

我正在尋找使用MVC創建下拉列表編輯器模板的最佳方法。似乎有各種方法,但我找不到任何最好的方法,每個人似乎都以不同的方式做。我使用Razor也使用MVC3,因此一個適用於此的方法是首選。ASP.NET MVC DropDown編輯器模板

回答

20

有很多方式和說法這是最好的將是主觀的,在你的情況下它的方式,你忘了你的問題描述可能無法正常工作。下面是我如何做到這一點:

型號:

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; } 
} 

控制器:

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"); 
    } 
} 

視圖(~/Views/Home/Index.cshtml):

@model MyApp.Models.MyViewModel 

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

編輯模板(~/Views/Home/EditorTemplates/MyViewModel.cshtml):

@model MyApp.Models.MyViewModel 

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

感謝這個,這似乎是我想要的東西。 – Craig 2010-10-25 21:01:21

+1

謝謝Darin。但編輯器模板只有一個taks(顯示下拉菜單)。你怎麼能簡單地調用EditotFormModel()?如果我需要兩個編輯器模板呢?一個用於下拉菜單,一個用於複選框列表?兩個我想使用int他相同的看法? – Shyju 2012-01-08 18:43:09

1

我個人認爲列表項應放置在視圖中的數據不是視圖模型,但它實際上取決於如果你是顯示下拉永遠不會改變(使用視圖的數據),或者如果你要動態地修改(使用視圖模型)。

在這個例子中你張貼了同樣的看法模型索引操作。索引操作僅對所選項目感興趣,因此可以將索引後操作的參數更改爲字符串selectedItem。這樣,模型聯編程序將查看錶單參數併爲您填充索引參數。

而且,我認爲這將是更好的傳遞SelectedListItems名單下來認爲,這樣你就不需要任何轉換與不需要的項目類。

4
+0

我喜歡這個解決方案,但它可以DI'd了多一點,就像使用'DependencyResolver',而不是'Activator'實例 – 2012-12-10 20:43:05

+0

其實我做了很多改進,但我覺得懶得更新文章:)也許我會做一個新的,然後我告訴你:) – 2012-12-10 22:29:14