MVC:填充Html .DropDownList的最佳方式

时间:2014-09-16 06:02:31

标签: asp.net-mvc html.dropdownlistfor

我正在寻找将动态数据引入视图以填充下拉列表的合理理念。为下拉列表和其他"开销"创建模型对象是一个好主意。数据还是使用viewbag?

由于

4 个答案:

答案 0 :(得分:5)

指导示例:

我认为实现目标的最佳方法是使用ViewModel。您可以通过此方式加载要在View中显示的内容。因此,您需要使用您的帐户列表创建一个下拉列表,该列表将加载到您的控制器中。您还将在其中拥有IEnumerable PErsoncontact,它们也将加载到您的控制器中。然后您的控制器将ViewModel传递给View。您可以将此作为指南。

视图模型:

public class PersonViewModel
{
    public int PersonID {get;set;}
    public List<SelectListItem> PersonContactList {get;set;}
    public IEnumerable<TypesAvail> TypesAvails{get;set;}
}

Razor视图中的下拉列表:

@Html.DropDownListFor(m => m.PersonID , Model.PersonContactList )

修改: - 这是一个例子。你可以在同一个模型中创建一个新类。

public class TypesAvail
{
     public String TypeNme { get; set; }
    public long TypeID { get; set; }
    public int NumSelected { get; set; }
    public int TypeCount { get; set; }
    public IEnumerable<SelectListItem> CarsAvail 
    {
        get
        {
            return new SelectList(
                    Enumerable.Range(0, TypeCount+1)
                    .OrderBy(typecount => typecount)
                    .Select(typecount => new SelectListItem
                    {
                        Value = typecount.ToString(),
                        Text = typecount.ToString()
                    }), "Value", "Text");
        }
    } 
}

Razor视图中的下拉列表:

@Html.DropDownListFor(m=> m.NumSelected, Model.CarsAvail)

答案 1 :(得分:4)

使用ViewBag(正如一些人在其他答案/评论中建议的那样)从控制器获取数据以查看通常被视为代码缺失。

理想情况下,ViewModel应包含视图所需的所有数据。因此,使用您的控制器在ViewModel的属性上填充此数据:

以下是如何使用Html.DropDownListFor使用模型在ASP.NET MVC中创建下拉列表的简单示例。 您可以像这样在* .cshtml文件中内联所有这样做:

@Html.DropDownListFor(model => model.Package.State, new SelectList(
                  new List<Object>{ 
                       new { value = 0 , text = "Red"  },
                       new { value = 1 , text = "Blue" },
                       new { value = 2 , text = "Green"}
                    },
                  "value",
                  "text",
                   2))

将创建如下:

<select id="Package_State" name="Package.State"><option value="0">Red</option>
<option value="1">Blue</option>
<option value="2">Green</option>
</select>

有关详细信息,请参阅this answer

答案 2 :(得分:2)

将数据包含在View模型或ViewBag中都是不错的选择,最好的选择完全取决于您的特定用例。

如果此下拉列表仅应包含在一个(或仅几个)页面中,那么成为 ViewModel 的一部分是有意义的。

如果每个页面都有下拉列表(例如,如果它是菜单或页脚的一部分),您可以创建一个提供 ViewBag 数据的BaseController对于下拉列表,让你的其他控制器继承:

<强> BaseController.cs

public class BaseController : Controller
{
    public BaseController() {
        ViewBag.MyDroprown = ...
    }
}

任何其他控制器

// inheriting from BaseController will make ViewBag.MyDroprown accessible in the View
public class HomeController : BaseController
{
    // Any actions here
}

答案 3 :(得分:1)

在我看来,View模型应该包含渲染视图所需的所有数据,并且可以在创建视图时使用。

对我使用ViewBag就像在代码中使用dynamic类型一样 - 它为您提供了一些灵活性,但却带来了可能出错的代价,所以我尽量避免使用可能的错误