Asp.net mvc 在ASP.NET MVC中格式化下拉列表

Asp.net mvc 在ASP.NET MVC中格式化下拉列表,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我正在用ASP.NETMVC4构建一个应用程序。我正在将模型绑定到视图。在我看来,我需要一个下拉列表。该下拉列表需要显示季度。季度应显示为第一季度、第二季度、第三季度和第四季度。我的型号只有四分之一。它们的定义如下: public List<short> Quarters = new List<short>() { get; set; } public short? SelectedQuarter = null; public void Initialize() {

我正在用ASP.NETMVC4构建一个应用程序。我正在将模型绑定到视图。在我看来,我需要一个下拉列表。该下拉列表需要显示季度。季度应显示为第一季度、第二季度、第三季度和第四季度。我的型号只有四分之一。它们的定义如下:

public List<short> Quarters = new List<short>() { get; set; }
public short? SelectedQuarter = null;

public void Initialize() {
  Quarters.Add(1);
  Quarters.Add(2);
  Quarters.Add(3);
  Quarters.Add(4);
}
public IEnumerable<string> QuartersDisplay
{
    get { return Quarters.Select(q => string.Format("Q{0}", q)); }
}
public IDictionary<short, string> QuartersOptions
{
    get { return Quarters.ToDictionary(q => q, q => string.Format("Q{0}", q)); }
}
不知何故,我需要在每个值前面加上Q。但是,我不确定如何在ASP.NET MVC中实现这一点。有人是怎么做到的


谢谢

假设您拥有此属性:

public List<short> Quarters { get; set; }
model.QuartersDisplay
model.QuartersOptions
或:

然而,从语义上看,它确实感觉这属于视图模型,而不是消费代码。理想情况下,视图只需要直接绑定到视图模型上的属性,而不需要转换这些属性。大概是这样的:

public List<short> Quarters = new List<short>() { get; set; }
public short? SelectedQuarter = null;

public void Initialize() {
  Quarters.Add(1);
  Quarters.Add(2);
  Quarters.Add(3);
  Quarters.Add(4);
}
public IEnumerable<string> QuartersDisplay
{
    get { return Quarters.Select(q => string.Format("Q{0}", q)); }
}
public IDictionary<short, string> QuartersOptions
{
    get { return Quarters.ToDictionary(q => q, q => string.Format("Q{0}", q)); }
}
如果模型是域模型,那么我建议在域和视图之间引入视图模型,因为这不属于域模型

再想想这个。。。是否希望一个属性同时包含下拉列表的显示和支持值?我想那可能是一本词典吧?大概是这样的:

public List<short> Quarters = new List<short>() { get; set; }
public short? SelectedQuarter = null;

public void Initialize() {
  Quarters.Add(1);
  Quarters.Add(2);
  Quarters.Add(3);
  Quarters.Add(4);
}
public IEnumerable<string> QuartersDisplay
{
    get { return Quarters.Select(q => string.Format("Q{0}", q)); }
}
public IDictionary<short, string> QuartersOptions
{
    get { return Quarters.ToDictionary(q => q, q => string.Format("Q{0}", q)); }
}

请记住,下拉列表通常绑定到两件事。包含我们在此构建的可能值列表的属性和包含选定值的属性,选定值保留为SelectedQuarter属性。

创建一个SelectList供DropdownListFor使用,以便将选定选项绑定到SelectedQuarter属性,但显示“友好”名称

视图模型

public class MyViewModel
{
  [Display(Name = "Quarter")]
  [Required]
  public short? SelectedQuarter { get; set; } // must be a property, not a field!
  IEnumerable<SelectListItem> QuarterList { get; set; }
}
控制器

public ActionResult Edit()
{
  MyViewModel model = new MyViewModel();
  ConfigureViewModel(model);
  return View(model);
}

public ActionResult Edit(MyViewModel model)
{
  if(!ModelState.IsValid)
  {
    ConfigureViewModel(model);
    return View(model);
  }
  // model.SelectedQuarter contains the selected value
}

private void ConfigureViewModel(model)
{
  model.SelectedQuarter = new List<SelectListItem>()
  {
    new SelectListItem() { Value = "1", Text = "Q1" },
    new SelectListItem() { Value = "2", Text = "Q2" },
    new SelectListItem() { Value = "3", Text = "Q3" },
    new SelectListItem() { Value = "4", Text = "Q4" },
  }
}
看法

您可能需要生成IEnumerable以供dropown使用,例如新的SelectListItem{Value=1,Text=Q1},这样您可以绑定到模型属性short SelectedQuarter,但显示相应的文本。