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