理论问题在这里。
我有一个属性“状态”,它只能接受 2 个不同的值(打开、关闭),我想将其设置为枚举类型的属性。在 codefirst mvc 应用程序中,枚举应该在数据模型中、视图模型中还是两者中定义?
我倾向于将枚举作为视图模型的一部分,并且该模型的 codefirst 属性将只存储枚举的字符串值。然后,我将使用 automapper 来回映射 2 个值。viewmodel 的 enum 属性将显示为单选按钮。
想法?
理论问题在这里。
我有一个属性“状态”,它只能接受 2 个不同的值(打开、关闭),我想将其设置为枚举类型的属性。在 codefirst mvc 应用程序中,枚举应该在数据模型中、视图模型中还是两者中定义?
我倾向于将枚举作为视图模型的一部分,并且该模型的 codefirst 属性将只存储枚举的字符串值。然后,我将使用 automapper 来回映射 2 个值。viewmodel 的 enum 属性将显示为单选按钮。
想法?
这取决于。
1)如果您有其他代码可以访问您的data model
(除了您的视图),那么您可能希望此 Status 属性为枚举类型。这样第三方代码就不会破坏您的逻辑。无论如何,即使您现在没有这样的代码,我建议您使用 enum 来实现前向兼容性:mabby 您或其他开发人员将来会添加它。这是一个最佳实践。恕我直言,这是强制性的。
2) 在视图模型中使用枚举怎么样?恕我直言,这是可选的。因为如果您想验证您的输入,您可能会在您的控制器操作方法中的服务器上执行此操作。如果您使用单选按钮,您甚至不需要验证控制器中的输入。只需在您的视图中使用它:
@model path.YourViewModel
@using YourEnumNamespace; /* where You defined Your Status enum */
@using (Html.BeginForm("YourMethod", "YourController", FormMethod.Post, null))
{
<fieldset>
<div>
@foreach (var enumValue in Enum.GetValues(typeof(Status)))
{
<div>
@Html.Label(enumValue.ToString())
@Html.RadioButtonFor(model => model.Title, enumValue)
</div>
}
</div>
<input type="submit" value="Save"/>
</fieldset>
}
只需像上面的代码一样枚举枚举值。
总结一下:在viewmodel中没有必要使用enum
type,但是在datamodel中考虑前向兼容性和使用enum
type是一个很好的做法。
我通常在我的域模型和 ViewModel 中都有它们,Entity Framework 会将它们映射到数据库中的整数。我创建了一些 html 助手,它们为我的 ViewModel 中的枚举创建下拉列表。