使用EnumDropDownListFor绑定到对象的属性

时间:2017-09-28 16:59:13

标签: asp.net-mvc enums html-helper asp.net-mvc-5.2 asp.net-mvc-5.1

我想使用@ Html.EnumDropDownListFor并且我遇到了问题。

这就是我所拥有的:

@Html.EnumDropDownListFor(x => x.DefaultProviderEnum, 
               "Select default provider", new { @class = "form-control", id = "pro" })

DefaultProviderEnum的类型为ProviderFormat

public enum ProviderFormat
{
    [Description("ASG")]
    ASG = 1,
    [Description("SCS")]
    SCS = 2
}

我在模型中正确设置它并在加载时正确显示。我的问题是当我发布它时,我必须在我的对象中手动设置它而不是绑定到我的对象上的属性,这是一个int:

 model.CU.DefaultProviderInt = (int)model.DefaultProviderEnum;

有没有办法将枚举下拉绑定到对象的属性而不必以这种方式设置?

2 个答案:

答案 0 :(得分:1)

model.CU对象也会被ModeBinder绑定(绑定?),并且提交表单时提供的值都是。

因此,在您的表单中,您可以拥有这样的隐藏属性:

@Html.HiddenFor(x => x.CU.DefaultProviderInt, new { id = "cu-default-provider" })

然后在change下拉列表中添加DefaultProviderEnum事件处理程序,并使用select值设置隐藏输入值。

$(function() {
    $("#DefaultProviderEnum").change(function(){
        $("#cu-default-provider").val($(this).val());
    })
});

现在提交表单时,两个属性都具有相同的值。

还有另一种方法可以做到这一点。 如果您在代码中的某处手动设置DefaultProviderEnum的值,则上述代码将不起作用。因此,您可以为DefaultProviderEnum属性设置自定义设置器:

private ProviderFormat defaultProviderEnum;

public ProviderFormat DefaultProviderEnum
{
    get { return defaultProviderEnum; }
    set
    {
        if (this.CU != null)
        {
            this.CU.DefaultProviderInt = (int)value;
        }

        defaultProviderEnum = value;
    }
}

但是,这也可能取决于DefaultModelBinder绑定属性的顺序。 (如果CU在设置DefaultProviderEnum时为空,那么这可能不起作用。所以请确保在模型的构造函数中初始化CU

第三种方法和最佳方法是手动将枚举转换为int并将其设置为CU.DefaultProviderInt

答案 1 :(得分:1)

你有什么问题?如果该字段绑定到DefaultProviderEnum,则该模型绑定器将唯一设置该值,因此需要一些手动干预来基于此设置不同的属性。没有办法让模型绑定器根据一个已发布的值设置两个属性,如果这是您正在咆哮的树。

但是,你可以简单地拥有一个属性:

public int DefaultProviderInt => (int)DefaultProviderEnum;

然后,它将始终只返回枚举值的int强制,无论目前发生什么。