Asp.net mvc 验证消息获胜';t出现-接受';请选择';作为条目
我正在提交一个空白表单,所有其他字段都会显示正确的验证错误消息,说明该字段不能为空,只有一个字段除外 模型如下:Asp.net mvc 验证消息获胜';t出现-接受';请选择';作为条目,asp.net-mvc,validation,enums,html-select,Asp.net Mvc,Validation,Enums,Html Select,我正在提交一个空白表单,所有其他字段都会显示正确的验证错误消息,说明该字段不能为空,只有一个字段除外 模型如下: public enum Medium { [Description("Teleconference & Report")] Teleconference_Report, [Description("Email & Telephone")] Email_Telephone } [Required] [Display(Name = "Me
public enum Medium
{
[Description("Teleconference & Report")]
Teleconference_Report,
[Description("Email & Telephone")]
Email_Telephone
}
[Required]
[Display(Name = "Medium")]
public Medium Medium { get; set; }
以下是表单中的字段:
<div class="form-group">
@Html.LabelFor(model => model.Medium, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-5">
@Html.DropDownList("MediumID", null, "Please select...", htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Medium, "", new { @class = "text-danger" })
</div>
</div>
@LabelFor(model=>model.Medium,htmlAttributes:new{@class=“controllabel col-md-2”})
@DropDownList(“MediumID”,null,“请选择…”),htmlAttributes:new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.Medium,“,new{@class=“text danger”})
“MediumID”下拉列表使用viewbag填充,该viewbag设置为以下返回值:
// Puts all of the mediums of communication into a user friendly dropdownlist.
public List<SelectListItem> GetMediumList()
{
List<SelectListItem> mediumList = new List<SelectListItem>();
foreach (Medium state in EnumToList<Medium>())
{
mediumList.Add(new SelectListItem
{
Text = GetEnumDescription(state),
Value = state.ToString(),
});
}
return mediumList;
}
//将所有通信媒介放入用户友好的下拉列表中。
公共列表GetMediumList()
{
List mediumList=新列表();
foreach(枚举列表()中的中间状态)
{
mediumList.Add(新建SelectListItem
{
Text=GetEnumDescription(状态),
Value=state.ToString(),
});
}
返回媒体列表;
}
问题是,当“请选择…”下拉列表的默认显示被保留时,这将被接受,表单将被提交,而我的任何其他字段都不会发生这种情况。当查看数据库中的新条目时,“Medium”字段设置为DropDownList中的第一项,即“Teleconference&Report”
非常感谢您的帮助
编辑:
下面显示了另一个名为“Frequency”的枚举的表单部分,但这些不会更改为用户友好的字符串
<div class="form-group">
@Html.LabelFor(model => model.Frequency, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-5">
@Html.EnumDropDownListFor(model => model.Frequency, "Please select...", htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Frequency, "", new { @class = "text-danger" })
</div>
</div>
@LabelFor(model=>model.Frequency,htmlAttributes:new{@class=“controllabel col-md-2”})
@EnumDropDownListFor(model=>model.Frequency,“请选择…”),htmlAttributes:new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.Frequency,“,new{@class=“text danger”})
下面显示了将枚举转换为用户友好字符串的两种方法:
// Returns a 'user friendly', readable version of the enum.
public static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes =
(DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
return attributes[0].Description;
else
return value.ToString();
}
// Puts all of the same enums into a list.
public static IEnumerable<T> EnumToList<T>()
{
Type enumType = typeof(T);
// Can't use generic type constraints on value types,
// so have to do check like this.
if (enumType.BaseType != typeof(Enum))
throw new ArgumentException("T must be of type System.Enum");
Array enumValArray = Enum.GetValues(enumType);
List<T> enumValList = new List<T>(enumValArray.Length);
foreach (int val in enumValArray)
{
enumValList.Add((T)Enum.Parse(enumType, val.ToString()));
}
return enumValList;
}
//返回枚举的“用户友好”可读版本。
公共静态字符串GetEnumDescription(枚举值)
{
FieldInfo fi=value.GetType().GetField(value.ToString());
DescriptionAttribute[]属性=
(DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute),false;
if(attributes!=null&&attributes.Length>0)
返回属性[0]。说明;
其他的
返回值.ToString();
}
//将所有相同的枚举放入列表中。
公共静态IEnumerable枚举列表()
{
类型enumType=typeof(T);
//无法对值类型使用泛型类型约束,
//所以必须这样做检查。
if(enumType.BaseType!=typeof(Enum))
抛出新ArgumentException(“T必须是System.Enum类型”);
数组enumValArray=Enum.GetValues(enumType);
List enumValList=新列表(enumValArray.Length);
foreach(enumValArray中的int val)
{
Add((T)Enum.Parse(enumType,val.ToString());
}
返回枚举列表;
}
将EnumDataType属性添加到视图模型的属性中:
[EnumDataType(typeof(Medium), ErrorMessage = "Submitted value is not valid for the enum")]
public Medium Medium { get; set; }
无论如何,您都应该添加它,因为枚举可以表示任何数值,并且不会被MVC框架自动验证
我希望这有帮助 将EnumDataType属性添加到视图模型的属性中:
[EnumDataType(typeof(Medium), ErrorMessage = "Submitted value is not valid for the enum")]
public Medium Medium { get; set; }
无论如何,您都应该添加它,因为枚举可以表示任何数值,并且不会被MVC框架自动验证
我希望这有帮助 你能展示你的行动方法吗once@Rahul我想不出一种不泄露机密信息的方式来展示它。我有一个GET Create()和一个POST Create()。在GET中,我有以下代码:ViewBag.MediumID=GetMediumList();如果失败的话,这也在帖子里。MediumID包含在参数内的绑定中。其他信息也不相关,或者对我没有帮助。@Coulton它是使用ViewBag传递给表单的(参见上面的注释)。这部分工作是因为当您选择一个下拉列表时,下拉列表会填充并工作。当“请选择”突出显示时,它不会显示模型错误消息,即使它在模型中设置为“必需”,并且“请选择”不是条目/枚举,而是默认选项。您可以显示您的操作方法吗once@Rahul我想不出一种不泄露机密信息的方式来展示它。我有一个GET Create()和一个POST Create()。在GET中,我有以下代码:ViewBag.MediumID=GetMediumList();如果失败的话,这也在帖子里。MediumID包含在参数内的绑定中。其他信息也不相关,或者对我没有帮助。@Coulton它是使用ViewBag传递给表单的(参见上面的注释)。这部分工作是因为当您选择一个下拉列表时,下拉列表会填充并工作。当“请选择”突出显示时,它不会显示模型错误消息,即使它在模型中设置为“必需”,并且“请选择”不是一个条目/枚举,而是一个默认选项。感谢您的输入,我已将其添加到我的模型中,它仍然不会显示消息。我是否需要在此处更改视图中的任何内容:@Html.ValidationMessageFor(model=>model.Medium,“,new{@class=“text danger”}),以便显示此错误消息?或者我需要从模型中删除[Required]吗?我只是在VS中做一些实验。我将很快报告:)非常感谢,感谢您的时间。这里有一个链接,指向正在发生的事情的屏幕截图:。可能会更清楚。奇怪的是,我刚刚用类似的代码创建了一个项目。一个带有
[Required]
的枚举,它马上就可以工作了。我将向您展示频率表部分,可能会有所帮助,因为它们略有不同。频率形式部分使用EnumDropDownList,而媒体使用us