我正在通过将旧的PHP程序重构为ASP格式来学习C#/ MVC 4。该程序的目的是为客户约会创建日历条目,包括一些基本的客户信息。我最近的挑战是将静态数据加载到页面上的多个@ Html.DropDownLists中。在通过这个(How to add static list of items in MVC Html.DropDownList())和那个(How can I get this ASP.NET MVC SelectList to work?)进行黑客攻击之后我能够做到这一点,但我觉得我正在重新发明轮子......
模型的部分:( CommonDataModel.cs)
public class apptCounties{
public IEnumerable<SelectItemList> Counties {get; set;}
public apptCounties()
{
Counties = new[]
{
new SelectListItem{Text="Cook",Value="Cook"},
new SelectListItem{Text="Dupage",Value="Dupage"},
new SelectListItem{Text="Lake",Value="Lake"}
};
}
}
VIEWMODEL :( ScheduleDataViewModel.cs)
public class ScheduleDataViewModel {
public apptClient ClientData {get; set;}
/* ^--This is from another model specific to this app - I'm attempting to use
"CommonDataModel.cs" to hold multiple lists of static data (Counties, Races,
Genders, etc) & then append app-specific data through specialized models.
I plan on expanding functionality later. */
public apptCounties Counties {get; set;}
public ScheduleDataViewModel()
{
ClientData = new apptClient();
Counties = new apptCounties();
}
}
CONTROLLER :( ScheduleController.cs)
public ActionResult Schedule()
{
var model = new ScheduleDataViewModel();
return View(model);
}
视图部分:( Index.cshtml - 强调类型为ScheduleDataViewModel)
@Html.DropDownList("Counties", Model.Counties)
对不起任何笨拙的语法 - 我的代码不在我面前!我可以验证,至少上面的一般想法在构建时是否有效。测试。
我担心我过于复杂的程序应该是一个简单程序。我是否真的在这里使用了所有构造函数方法,或者有人可以建议一个更优雅的解决方案来提供静态数据列表而不受数据库的好处?
答案 0 :(得分:3)
如果您的列表是静态的并且相对独立于您的实际模型,您可能会发现在单独的静态类中定义它们更简单:
public static class ListOptions
{
public static readonly List<string> Counties = ...
}
然后在视图中创建SelectList
:
@Html.DropDownListFor(m => m.County, new SelectList(ListOptions.Counties))
如果合适的话,这样做本身没有任何错误。如果您的列表仅与该特定模型相关,则是,它属于视图模型;然而,即使这样,如果值不是变量,我也不会担心简单地将它变成静态属性。
我当然不同意在视图中创建SelectList
本身必然是坏事的观点;毕竟,模型和控制器不需要知道值来自SelectList - 只有选择的内容。提出选项的方式是观点的关注。
答案 1 :(得分:0)
看起来没问题。也许一些语法上的改进。
动作
public ActionResult Schedule()
{
return View(new ScheduleDataViewModel());
}
视图模型
// You want class names to be Upper-case
public class ScheduleDataViewModel
{
public ApptClient ClientData { get; set; }
public ApptCounties Counties { get; set; }
public ScheduleDataViewModel()
{
ClientData = new ApptClient();
Counties = new ApptCounties();
}
}