在 ASP.NET MVC 中格式化下拉列表
Formatting a Drop Down List in ASP.NET MVC
我正在使用 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);
}
不知何故,我需要在每个值前添加 "Q"。但是,我不确定如何在 ASP.NET MVC 中执行此操作。有人是怎么做到的?
谢谢!
假设你有这个 属性:
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
(如果模型是域模型,那么我建议在域和视图之间引入视图模型,因为这不属于域模型。)
再考虑一下...你想要 one 属性 同时显示 和 作为后盾吗下拉列表的值?我想那可能是 IDictionary<short, string>
?像这样:
public IDictionary<short, string> QuartersOptions
{
get { return Quarters.ToDictionary(q => q, q => string.Format("Q{0}", q)); }
}
在这种情况下,您将绑定到 属性:
model.QuartersOptions
请记住,下拉列表通常绑定到 两个 事物。 属性 包含可能值的列表(这是我们在这里构建的)和 属性 包含 selected 值(仍然是您的 SelectedQuarter
属性).
创建一个供 DropdownListFor()
使用的 SelectList,以便将所选选项绑定到 属性 SelectedQuarter
,但显示 'friendly' 名称。
查看模型
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" />
}
我正在使用 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);
}
不知何故,我需要在每个值前添加 "Q"。但是,我不确定如何在 ASP.NET MVC 中执行此操作。有人是怎么做到的?
谢谢!
假设你有这个 属性:
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
(如果模型是域模型,那么我建议在域和视图之间引入视图模型,因为这不属于域模型。)
再考虑一下...你想要 one 属性 同时显示 和 作为后盾吗下拉列表的值?我想那可能是 IDictionary<short, string>
?像这样:
public IDictionary<short, string> QuartersOptions
{
get { return Quarters.ToDictionary(q => q, q => string.Format("Q{0}", q)); }
}
在这种情况下,您将绑定到 属性:
model.QuartersOptions
请记住,下拉列表通常绑定到 两个 事物。 属性 包含可能值的列表(这是我们在这里构建的)和 属性 包含 selected 值(仍然是您的 SelectedQuarter
属性).
创建一个供 DropdownListFor()
使用的 SelectList,以便将所选选项绑定到 属性 SelectedQuarter
,但显示 'friendly' 名称。
查看模型
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" />
}