【问题标题】:Bind to object's property with EnumDropDownListFor使用 EnumDropDownListFor 绑定到对象的属性
【发布时间】:2017-09-28 16:59:13
【问题描述】:

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

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

【问题讨论】:

  • 什么是model.CU.DefaultProvider?您提到该属性的类型为ProviderFormat,后来您说它的类型为int?你忽略了CU.DefaultProvider 所做的事情。
  • DefaultProvider 只是 CU 对象上的一个 int。我正在尝试使用 ProviderFormat 类型的模型关闭 DefaultProvider 来设置它。

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


【解决方案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 绑定属性的顺序。 (如果在设置DefaultProviderEnumCU 为null,那么这可能不起作用。所以请确保在模型的构造函数中初始化CU


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

【讨论】:

    【解决方案2】:

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

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

    public int DefaultProviderInt => (int)DefaultProviderEnum;
    

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

    【讨论】:

    • 我正试图使用​​帮助器将下拉列表填充为枚举,并将其设置在一个 int 对象上的属性。如果我只是将默认提供程序属性从 int 更改为 ProviderFormat 枚举,它将像我想要的那样工作,只是想知道是否有一种方法可以使用 int 作为它使用此帮助器设置的属性。
    • 没有。如果您要发布枚举,则必须绑定到枚举。
    猜你喜欢
    • 1970-01-01
    • 2013-03-14
    • 2012-10-12
    • 2020-06-22
    • 2011-10-03
    相关资源
    最近更新 更多