70

在我看来,我有一个enumdropdownlist(Asp.Net MVC 5.1 中的一个新功能)。

@Html.EnumDropDownListFor(m => m.SelectedLicense,new { @class="form-control"})

如果我执行上面的代码,我会得到以下枚举的下拉列表。

public enum LicenseTypes
{
    Trial = 0,
    Paid = 1
}

但默认情况下,我希望我的下拉列表有一个值(自定义文本),这就是我尝试过的

@Html.EnumDropDownListFor(m => m.SelectedLicense,"Select a license" ,new { @class="form-control"})

但现在问题是当我运行它时,我的下拉列表看起来像这样 在此处输入图像描述 所以,我想显示的默认文本默认情况下不会出现。如果用户选择“选择许可证”并尝试提交表单,它会显示“选择许可证”错误,但不会显示为默认文本。我需要改变什么?

ps:图片是页面加载时的截图。默认情况下,它会将试用显示为选定选项。

4

5 回答 5

90

尝试改变start的方式Index,如下所示:LicenseTypes10

public enum LicenseTypes
{
    Trial = 1,
    Paid = 2
}

然后您可以使用Range attribute来验证所选的许可证类型,如下所示:

public class YourViewModel
{
     //Other properties
     [Range(1,int.MaxValue,ErrorMessage = "Select a correct license")]
     public LicenseTypes LicenseTypes { get; set; }
}

最后,在您看来:

   @Html.EnumDropDownListFor(m => m.LicenseTypes,"Select a license",new { @class = "form-control"})
   @Html.ValidationMessageFor(m => m.LicenseTypes)
于 2014-02-19T13:49:48.673 回答
74

到您EnumDropDownListFor呈现时SelectedLicense,该类型已经具有默认值,即0.

只需将您的SelectedLicense属性类型更改为可为空的枚举,如下所示:

public LicenseTypes? SelectedLicense { get; set; }

这也使您可以继续使用该Required属性,我认为该属性明显更干净。该Required属性不允许空响应,因此即使您的模型允许空值,表单也不会。

于 2014-04-15T13:35:29.890 回答
16

我有一个枚举:

public enum Sex
{
    Male,
    Female
}

在我的模型中,我有:

    [DisplayName("Sex")]
    [Required]
    public Sex? Sex { get; set; }

一个在视图中:

    @Html.EnumDropDownListFor(model => model.Sex, "Select sex", new { @class = "form-control", type = "text"})

通过这个我有一个带有默认选项“选择性别”的下拉列表,但验证只接受枚举提供的选项(“男性”和“女性”)。

在 MVC3(没有 EnumDropDownListFor)中,我在模型中使用:

    [DisplayName("Sex")]
    [Required(AllowEmptyStrings=false)]
    public Sex? Sex { get; set; }

    Sex = null;

    Sexes = Repository.GetAutoSelectList<Sex>("");

鉴于:

    @Html.DropDownListFor(model => model.Sex, Model.Sexes, new { @class = "form-control", type = "text" })
于 2014-06-04T13:01:09.260 回答
10

ViewModel 类需要在 enum 属性上设置默认值,才能使其成为默认选择的 public

public class Test
    {
        public Cars MyCars { get; set; }
        public enum Cars
        {
            [Display(Name = @"Car #1")]
            Car1 = 1,
            [Display(Name = @"Car #2")]
            Car2 = 2,
            [Display(Name = @"Car #3")]
            Car3 = 3
        }

    }

控制器:

 public class EnumController : Controller
    {
        // GET: Enum
        public ActionResult Index()
        {
            var model = new Test {MyCars = Test.Cars.Car3}; // set default value
            return View(model);
        }
        [HttpPost]
        public ActionResult Index(Test model)
        {
            .....
        }
    }

看法:

@Html.BeginForm()
{
<div class="panel bg-white">
    <div class="panel-header fg-white">
        Enums
    </div>
    <div class="panel-content">
        <div class="input-control select size3">
            @Html.EnumDropDownListFor(model => model.MyCars)

        </div>
    </div>
    <input type="submit" class="button success large" />
</div>
}
于 2014-07-22T16:06:45.010 回答
0

我是不是有点晚了?

更改枚举类型的值并不是很令人满意。

也不会更改模型属性以使其可为空,然后添加 [Required] 属性以防止其为空。

我建议使用 ViewBag 来设置下拉菜单的默认选定值。 下面控制器的第 4 行是唯一重要的。

编辑:啊...新手...我的第一个想法是使用 ModelState.SetModelValue 因为我的新手本能阻止我简单地尝试在 ViewBag 中设置所需的值,因为下拉列表已绑定到模型。我肯定有一个问题:它会绑定到模型的属性,而不是 ViewBag 的属性。我错了:ViewBag 没问题。我更正了代码。

这是一个例子。

模型:

namespace WebApplication1.Models {

    public enum GoodMusic {
        Metal,
        HeavyMetal,
        PowerMetal,
        BlackMetal,
        ThashMetal,
        DeathMetal // . . .
    }

    public class Fan {
        [Required(ErrorMessage = "Don't be shy!")]
        public String Name { get; set; }
        [Required(ErrorMessage = "There's enough good music here for you to chose!")]
        public GoodMusic FavouriteMusic { get; set; }
    }
}

控制器:

namespace WebApplication1.Controllers {
    public class FanController : Controller {
        public ActionResult Index() {
            ViewBag.FavouriteMusic = string.Empty;
            //ModelState.SetModelValue( "FavouriteMusic", new ValueProviderResult( string.Empty, string.Empty, System.Globalization.CultureInfo.InvariantCulture ) );
            return View( "Index" );
        }
        [HttpPost, ActionName( "Index" )]
        public ActionResult Register( Models.Fan newFan ) {
            if( !ModelState.IsValid )
                return View( "Index" );
            ModelState.Clear();
            ViewBag.Message = "OK - You may register another fan";
            return Index();
        }
    }
}

看法:

@model WebApplication1.Models.Fan
<h2>Hello, fan</h2>
@using( Html.BeginForm() ) {
    <p>@Html.LabelFor( m => m.Name )</p>
    <p>@Html.EditorFor( m => m.Name ) @Html.ValidationMessageFor( m => m.Name )</p>
    <p>@Html.LabelFor( m => m.FavouriteMusic )</p>
    <p>@Html.EnumDropDownListFor( m => m.FavouriteMusic, "Chose your favorite music from here..." ) @Html.ValidationMessageFor( m => m.FavouriteMusic )</p>
    <input type="submit" value="Register" />
    @ViewBag.Message
}

如果模型索引操作中没有“ModelState.SetModelValue 或 ViewBag.FavouriteMusic = string.Empty”行,默认选择的值将是“金属”而不是“选择您的音乐...”

于 2016-04-26T20:40:15.127 回答