2015-02-10 52 views
0

我正在用ASP.NET MVC 4构建一个应用程序。我将我的模型绑定到视图。在我看来,我需要一个下拉列表。该下拉列表需要显示宿舍。宿舍应显示为“Q1”,“Q2”,“Q3”和“Q4”。我的模特只有四分之一的数字。他们是这样定义的:格式化ASP.NET MVC中的下拉列表

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中执行此操作。某人如何做到这一点?

谢谢!

+0

可能重复的[ASP.NET MVC DropDownListFor类型为List的模型](HTTP://计算器.com/questions/5688910/asp-net-mvc-dropdownlist for-with-model-of-type-liststring) – 2015-02-10 14:54:34

+0

您需要生成'IEnumerable '以供您的dropown使用(例如, 'new SelectListItem(){Value =“1”,Text =“Q1”}'所以你可以绑定到你的模型属性'Short SelectedQuarter',但是显示相应的文本。 – 2015-02-10 23:35:16

回答

0

创建一个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" }, 
    } 
} 

查看

@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" /> 
} 
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属性)的属性。