使用 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
绑定属性的顺序。 (如果在设置 DefaultProviderEnum
时 CU
为 null,那么这可能不起作用。因此请确保在模型的构造函数中初始化 CU
)
第三种也是最好的方法是手动将枚举转换为int并将其设置为CU.DefaultProviderInt
。
你有什么问题?如果该字段绑定到 DefaultProviderEnum
,那么这是模型绑定器唯一要设置的内容,无论如何,因此需要一些手动干预才能基于此设置不同的 属性。没有办法让 modelbinder 根据一个发布的值设置两个属性,如果那是你正在咆哮的树。
但是,您可以简单地 属性 如:
public int DefaultProviderInt => (int)DefaultProviderEnum;
然后,它总是 return 枚举值的 int 强制转换,无论此时发生什么。
我想使用@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
属性:
private ProviderFormat defaultProviderEnum;
public ProviderFormat DefaultProviderEnum
{
get { return defaultProviderEnum; }
set
{
if (this.CU != null)
{
this.CU.DefaultProviderInt = (int)value;
}
defaultProviderEnum = value;
}
}
但是,这也可能取决于 DefaultModelBinder
绑定属性的顺序。 (如果在设置 DefaultProviderEnum
时 CU
为 null,那么这可能不起作用。因此请确保在模型的构造函数中初始化 CU
)
第三种也是最好的方法是手动将枚举转换为int并将其设置为CU.DefaultProviderInt
。
你有什么问题?如果该字段绑定到 DefaultProviderEnum
,那么这是模型绑定器唯一要设置的内容,无论如何,因此需要一些手动干预才能基于此设置不同的 属性。没有办法让 modelbinder 根据一个发布的值设置两个属性,如果那是你正在咆哮的树。
但是,您可以简单地 属性 如:
public int DefaultProviderInt => (int)DefaultProviderEnum;
然后,它总是 return 枚举值的 int 强制转换,无论此时发生什么。