使用 EnumDropDownListFor 绑定到对象的 属性

Bind to object's property with EnumDropDownListFor

我想使用@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
}

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

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

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

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 属性:

自定义 setter
private ProviderFormat defaultProviderEnum;

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

        defaultProviderEnum = value;
    }
}

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


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

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

但是,您可以简单地 属性 如:

public int DefaultProviderInt => (int)DefaultProviderEnum;

然后,它总是 return 枚举值的 int 强制转换,无论此时发生什么。