【问题标题】:MVC Dropdownlistfor<>MVC 下拉列表for<>
【发布时间】:2013-06-10 07:57:18
【问题描述】:

我刚刚在 MVC 中启动了一个项目。我是 MVC asp.net 的新手。我想添加一个下拉列表框,就像我以前在 asp.net 中添加的那样。

下拉列表框在 asp.net 中的代码一瞥

<asp:Dropdownlist ID="ddlCity" runat="server">
<asp:ItemList Text="Kolkatta" Value="1"/>
<asp:ItemList Text="New Delhi" Value="2"/>
<asp:ItemList Text="Mumbai" Value="3"/>
<asp:ItemList Text="chennai" Value="4"/>
<asp:ItemList Text="Hydrabad" Value="5"/>
</asp:Dropdownlist>

我想要一个这样的下拉列表框....意思是,现在我需要为此创建一个模型和控制器。假设我已经有一个名为“Employee Entry Form”的视图,我只需要在该页面上添加一个下拉列表。 我不想为此下拉列表创建模型;我只需要在这个页面上。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    下拉列表的值应该在您的现有视图模型中:

    public class WhateverViewModel
    {
        // All of your current viewmodel fields here
        public string SelectedCity { get; set; }
        public Dictionary<string, string> CityOptions { get; set; }
    }
    

    在你的控制器中填充你想要的任何值(其中 SelectedCity 是你的数字 ID),然后在你的视图中执行以下操作:

    @Html.DropDownListFor(m => m.SelectedCity,
        new SelectList(Model.CityOptions, "Key", "Value", Model.SelectedCity))
    

    如果您的值永远不会改变,您可以将它们硬编码为视图模型的 static 成员,然后执行以下操作:

    @Html.DropDownListFor(m => m.SelectedCity,
        new SelectList(WhateverViewModel.CityOptions, "Key", "Value", Model.SelectedCity))
    

    无论哪种方式,这是该视图的数据,因此它属于您的视图模型。如果您不使用视图模型并且此视图直接绑定到域实体;你应该使用它们,现在是开始的好时机。

    【讨论】:

    • 在某些情况下,出于性能原因,您可能希望为给定的下拉菜单创建一个专门的模型。这将与实际数据库视图相关联,该视图旨在仅返回下拉列表所需的那些特定键/值对,并且在大多数情况下,其他键用于预过滤下拉列表。 Ant,我意识到您的视图模型设计允许这样做,但我认为根据原始问题明确调用它会有所帮助。
    【解决方案2】:

    您还可以采用另一种方法,即在 1 个帮助程序类中收集所有下拉列表,并使用静态函数返回这些列表。

    例如。 下拉帮助类

    namespace Asko.Web.Mvc.Infrastructure.Utils
    {
        public static class DropdownHelper
        {
            public static IEnumerable<SelectListItem> GetAllCategories()
            {
                var categories = category.GetAll();
                return categories.Select(x => new SelectListItem { Text = x.categoryName, Value = x.categoryId.ToString()}));
            }
        }
    }
    

    在这里,您将在页面中使用它:

    <td style="width: 150px;">
          <b>Category: </b>
          <br>
     @Html.DropDownListFor(m => m.CategoryId, DropdownHelper.GetAllCategories())
    </td>
    

    【讨论】:

    • DropDownHelper 在当前上下文中不存在,为什么?
    • 我宁愿避免从视图调用导致数据库往返的方法。 View 应该在 Model 中准备好一切,数据检索应该由 Controller 管理。
    【解决方案3】:

    如果你想避免使用模型,你可以简单地使用 ViewBag。在你的行动中:

    ViewBag.DirectorId = new SelectList(ListOfItemsToAdd, "dataValueField", "dataTextField", movie.DirectorId);
    

    在视图中:

    <%= Html.DropDownList("VariableNameToPost", ViewBag.DirectorId) //for asp.net view engine %> 
    @Html.DropDownList("VariableNameToPost", ViewBag.DirectorId) // for razor view engine
    

    然后接受该变量的操作将具有如下内容:

    public ActionResult theAction(string VariableNameToPost){...}
    

    参考资料:

    【讨论】:

    • 非常感谢您的即时回复。我自己解决了。我发现您在此处添加了答案,即复制粘贴。
    • 您的时间和回答没关系...但我做了我自己,它比您更容易和准确...
    • @Shahnawaz 您能否发布解决方案并将其标记为答案,以便遇到类似问题的其他开发人员可以找到它?
    【解决方案4】:

    如果您想直接在视图上创建一个下拉菜单,而不考虑控制器和模型,那么您可以使用以下代码创建它

    @Html.DropDownList("Departments", 
      new SelectList(new [] { new KeyValuePair<string, int>( "IT", 0 ), new KeyValuePair<string, int>( "HR", 1 )},"Value", "Key")) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2015-11-03
      相关资源
      最近更新 更多