2010-10-25 106 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