如何在ASP.NET MVC中设置来自模型的下拉值

时间:2016-11-14 16:37:13

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5

我坚持“如何在下拉列表中设置模型中设置的值。

我正在添加我现在所拥有的以及我尝试过的内容。

所以,我有一个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生成:

enter image description here

2 个答案:

答案 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;)将被选中。

不清楚您的ModelPropertyPrefixModelPropertyPrefixName属性返回了什么,但它们不是必需的,并且在视图中不应使用(HtmlHelper方法将始终生成纠正双向模型绑定所需的name属性。

另请注意,在生成Selected时需要设置SelectListItem的{​​{1}}属性是一种常见的误解。绑定到模型属性时,SelectListDropDownList()方法在内部生成自己的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.DateTimeForm‌at.GetMonthName(x) }); } 应包含PaymentFormMV(以及您需要的public int ExpirationMonth { get; set; }的其他属性),而不是PaymentCCMV

根据显示html图片的编辑,您生成public PaymentCCMV CreditDetails { get; set; }属性,该属性与您在视图中使用的name模型无关(它没有名为的属性) PaymentFormMV)因此您未正确绑定到模型,并且不会选择正确的选项。

从聊天中的评论中,您需要更改视图以使用PaymentInfo,然后方法将

@model MoveInMV

给出正确的双向模型绑定。