我想使用@ 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;
有没有办法将枚举下拉绑定到对象的属性而不必以这种方式设置?
答案 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强制,无论目前发生什么。