我正在寻找将动态数据引入视图以填充下拉列表的合理理念。为下拉列表和其他"开销"创建模型对象是一个好主意。数据还是使用viewbag?
由于
答案 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
类型一样 - 它为您提供了一些灵活性,但却带来了可能出错的代价,所以我尽量避免使用可能的错误