0

我正在通过将旧的 PHP 程序重构为 ASP 格式来学习 C#/MVC 4。该程序的目的是为客户约会创建日历条目,包括一些基本的客户信息。我最近的挑战是将静态数据加载到页面上的多个 @Html.DropDownLists 中。在破解了这个(如何在 MVC Html.DropDownList() 中添加静态项目列表)和那个(如何让这个 ASP.NET MVC SelectList 工作?)之后,我能够做到这一点,但我觉得我我重新发明轮子...

模型部分:(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();
  }
}

控制器:(ScheduleController.cs)

public ActionResult Schedule()
{
  var model = new ScheduleDataViewModel();
  return View(model);
}

部分视图:(Index.cshtml - 强类型为 ScheduleDataViewModel)

@Html.DropDownList("Counties", Model.Counties)

抱歉,那里有任何肮脏的语法 - 我的代码不在我面前!我可以验证至少上面的一般想法在构建和测试时是有效的。

我担心我把应该是一个更简单的程序过于复杂化了。我是否真的在正确的轨道上使用了所有的构造方法,或者有人可以建议一个更优雅的解决方案来提供静态数据列表而不需要数据库的好处?

4

2 回答 2

3

如果您的列表是静态的并且相对独立于您的实际模型,您可能会发现在单独的静态类中定义它们更简单:

public static class ListOptions
{
    public static readonly List<string> Counties = ...
}

然后SelectList在您的视图中创建:

@Html.DropDownListFor(m => m.County, new SelectList(ListOptions.Counties))

如果合适的话,这样做本身并没有错。如果您的列表仅与该特定模型相关,那么是的,它属于视图模型;但是,即使那样,如果值不是可变的,我也不担心简单地将其设为静态属性。

我当然不同意SelectList在视图中创建自身必然是一件坏事的观点。毕竟,模型和控制器不需要知道值来自 SelectList - 只需要知道选择的内容。呈现选项的方式是视图的关注点。

于 2013-05-10T16:45:11.533 回答
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();
    }
}
于 2013-05-10T16:14:40.610 回答