我坚持“如何在下拉列表中设置模型中设置的值。
我正在添加我现在所拥有的以及我尝试过的内容。
所以,我有一个PaymentFormMV
模型,它有另一个模型PaymentCCMV
public class PaymentFormMV
{
public PaymentCCMV CreditDetails { get; set; }
public string ModelPropertyPrefixName
{
get
{
return this.ModelPropertyPrefix.Replace("_", ".");
}
}
}
public class PaymentCCMV
{
[Display(Name = "Expiration Date")]
public int ExpirationMonth { get; set; }
}
cshtml文件从PaymentFormMV
获取数据<div class="form-group">
@Html.LabelFor(model => model.CreditDetails.ExpirationMonth, htmlAttributes: new { @class = "control-label col-md-2 required" })
<div class="col-md-10">
@Html.DropDownList(Model.ModelPropertyPrefixName + "CreditDetails.ExpirationMonth", Helpers.PossibleMonths,
new { id = Model.ModelPropertyPrefix + "CreditDetails_ExpirationMonth", @class = "form-control", style = "width:70px;" })
</div>
</div>
Helpers.PossibleMonths:显示所有月份
public static ICollection<SelectListItem> PossibleMonths
{
get
{
return new List<SelectListItem>()
{
new SelectListItem() { Text = "1 - Jan", Value = "1" },
new SelectListItem() { Text = "2 - Feb", Value = "2" },
new SelectListItem() { Text = "3 - Mar", Value = "3" },
new SelectListItem() { Text = "4 - Apr", Value = "4" },
new SelectListItem() { Text = "5 - May", Value = "5" },
new SelectListItem() { Text = "6 - Jun", Value = "6" },
new SelectListItem() { Text = "7 - Jul", Value = "7" },
new SelectListItem() { Text = "8 - Aug", Value = "8" },
new SelectListItem() { Text = "9 - Sep", Value = "9" },
new SelectListItem() { Text = "10 - Oct", Value = "10" },
new SelectListItem() { Text = "11 - Nov", Value = "11" },
new SelectListItem() { Text = "12 - Dec", Value = "12" },
};
}
}
要点:
我得到整数值model.CreditDetails.ExpirationMonth = 2
(根据数据库)
但我不知道如何将其设置为下拉菜单。因此,当屏幕加载时,我希望该值与下拉列表相关联。请指导我。所以,如果值为2,我应该在帮助方法中提到的下拉UI中获得类似2 - Feb
的内容。我是初学者,所以我可能不会遵循最佳实践,所以请耐心等待。
HTML生成:
答案 0 :(得分:2)
我的第二个@Vivien的回复,但我建议使用带有所选值(See MSDN:)的重载,然后您可以设置它。为了允许传递默认值,我还建议使用静态方法,并允许传入月份:
val m = Map("a" -> "false", "b" -> "true")
val aBool = m.get("a").exists(_.toLowerCase() == "true")
编辑:您的下拉列表可能会像
public static SelectList PossibleMonths(string defaultValue)
{
return new SelectList(List<SelectListItem>()
{
new SelectListItem() { Text = "1 - Jan", Value = "1" },
new SelectListItem() { Text = "2 - Feb", Value = "2" },
new SelectListItem() { Text = "3 - Mar", Value = "3" },
new SelectListItem() { Text = "4 - Apr", Value = "4" },
new SelectListItem() { Text = "5 - May", Value = "5" },
new SelectListItem() { Text = "6 - Jun", Value = "6" },
new SelectListItem() { Text = "7 - Jul", Value = "7" },
new SelectListItem() { Text = "8 - Aug", Value = "8" },
new SelectListItem() { Text = "9 - Sep", Value = "9" },
new SelectListItem() { Text = "10 - Oct", Value = "10" },
new SelectListItem() { Text = "11 - Nov", Value = "11" },
new SelectListItem() { Text = "12 - Dec", Value = "12" },
}, "Value", "Text", defaultValue);
}
假设CreditDetails对象始终不为null,否则必须进行空检查。
编辑:我错了,显然Html.DropDownList不支持SelectList,所以我恢复了原来的方法,并设置了所选的值(请注意上面的相同下拉代码,以便工作)。@Html.DropDownList(Model.ModelPropertyPrefixName + "CreditDetails.ExpirationMonth", Helpers.PossibleMonths(Model.CreditDetails.ExpirationMonth),
new { id = Model.ModelPropertyPrefix + "CreditDetails_ExpirationMonth", @class = "form-control", style = "width:70px;" })
答案 1 :(得分:1)
DropDownList()
(以及首选的DropDownListFor()
方法通过绑定到您的属性值来工作。在您的情况下,您希望绑定到ExpirationMonth
属性,您的代码视图应该是
@Html.DropDownList("CreditDetails.ExpirationMonth", Helpers.PossibleMonths, new { @class = "form-control", style = "width:70px;" }
或更好
@Html.DropDownListFor(m => m.CreditDetails.ExpirationMonth, Helpers.PossibleMonths, new { @class = "form-control", style = "width:70px;" }
如果您在GET方法中将ExpirationMonth
的值设置为3
并将模型传递给视图,则第3个选项(&#34; Mar&#34;)将被选中。
不清楚您的ModelPropertyPrefix
和ModelPropertyPrefixName
属性返回了什么,但它们不是必需的,并且在视图中不应使用(HtmlHelper
方法将始终生成纠正双向模型绑定所需的name
属性。
另请注意,在生成Selected
时需要设置SelectListItem
的{{1}}属性是一种常见的误解。绑定到模型属性时,SelectList
和DropDownList()
方法在内部生成自己的DropDownListFor()
并根据属性的值设置IEnumerable<SelectListItem>
属性(任何设置尝试你自己被忽略了)。唯一一次Selected
属性被尊重的时候是Selected
,而DropDownList("xxx", ...)
不是属性或模型。
作为旁注,静态方法中的代码可能只是
xxx
并且您的视图模型不应包含编辑数据时作为数据模型的属性。 public static IEnumerable<SelectListItem> PossibleMonths()
{
return Enumerable.Range(1, 12).Select(x => new SelectListItem()
{
Value = x.ToString(),
Text = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x)
});
}
应包含PaymentFormMV
(以及您需要的public int ExpirationMonth { get; set; }
的其他属性),而不是PaymentCCMV
根据显示html图片的编辑,您生成public PaymentCCMV CreditDetails { get; set; }
属性,该属性与您在视图中使用的name
模型无关(它没有名为的属性) PaymentFormMV
)因此您未正确绑定到模型,并且不会选择正确的选项。
从聊天中的评论中,您需要更改视图以使用PaymentInfo
,然后方法将
@model MoveInMV
给出正确的双向模型绑定。