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

以下のようなものからIndexLicenseTypes開始を変更してみてください。10

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次のように、プロパティのタイプを null 許容列挙型に変更するだけです。

public LicenseTypes? SelectedLicense { get; set; }

これにより、属性を引き続き使用することもできます。これにより、Required大幅にクリーンになったと思います。このRequired属性では null 応答が許可されないため、モデルで null が許可されていても、フォームでは許可されません。

于 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 クラスは、デフォルトで選択された public になるように、enum プロパティにデフォルト値を設定する必要があります。

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

私は少し遅れていますか?

列挙型の値を変更しても、満足できるものではありません。

モデル プロパティを変更して null 可能にすることも、 [Required] 属性を追加して null 可能にならないようにすることもありません。

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
}

モデルの Index アクションに「ModelState.SetModelValue または ViewBag.FavouriteMusic = string.Empty」行がないと、デフォルトで選択される値は「Select your music...」ではなく「Metal」になります。

于 2016-04-26T20:40:15.127 に答える