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

时间:2015-02-10 14:48:20

标签: asp.net-mvc asp.net-mvc-4

我正在使用ASP.NET MVC 4构建应用程序。我将我的模型绑定到视图。在我看来,我需要一个下拉列表。下拉列表需要显示季度。四分之一应显示为" Q1"," Q2"," Q3"和" Q4"。我的模型,只有四分之一的数字。它们的定义如下:

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);
}

不知何故,我需要提前补充&#34; Q&#34;每个值。但是,我不确定如何在ASP.NET MVC中执行此操作。有人这样做了吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

假设你有这个属性:

public List<short> Quarters { get; set; }

然后在您的视图或任何其他消费代码中,您可以生成一个字符串列表,其中包含:

model.Quarters.Select(q => "Q" + q)

或:

model.Quarters.Select(q => string.Format("Q{0}", q))

然而,从语义上来说,它真的感觉这属于视图模型,而不是消耗代码。理想情况下,视图应该只需要直接绑定到视图模型上的属性,而不是转换这些属性。像这样:

public IEnumerable<string> QuartersDisplay
{
    get { return Quarters.Select(q => string.Format("Q{0}", q)); }
}

然后消费代码只能绑定到该属性:

model.QuartersDisplay

(如果模型是域模型,那么我建议在域和视图之间引入视图模型,因为这不属于域模型。)


再考虑一下......您是否希望一个属性同时显示下拉列表的支持值?我想,这可能是IDictionary<short, string>?像这样:

public IDictionary<short, string> QuartersOptions
{
    get { return Quarters.ToDictionary(q => q, q => string.Format("Q{0}", q)); }
}

在这种情况下,您将绑定到该属性:

model.QuartersOptions

请记住,下拉列表通常会绑定到两个事物。包含可能值列表的属性(这是我们在此处构建的)以及包含选定值的属性(仍然是您的SelectedQuarter属性)。

答案 1 :(得分:0)

创建一个由DropdownListFor()使用的SelectList,以便将所选选项绑定到属性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" },
  }
}

查看

@model MyViewModel
@using(Html.BeginForm())
{
  @Html.LabelFor(m => m.SelectedQuarter)
  @Html.DropDownListFor(m => m.SelectedQuarter, Model.QuarterList, "-Please select-")
  @Html.ValidationMessageFor(m => m.SelectedQuarter)
  <input type="submit" />
}