web-dev-qa-db-ja.com

Html.EnumDropdownListFor:デフォルトテキストの表示

私の見解では、 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"})

しかし今、問題はそれを実行するとき、私のドロップダウンリストは次のようになります enter image description here そのため、表示したいデフォルトのテキストはデフォルトでは表示されません。ユーザーが「ライセンスの選択」を選択してフォームを送信しようとすると、「ライセンスの選択」というエラーが表示されますが、デフォルトのテキストとしては表示されません。変更する必要があるものはありますか?

Ps:画像は、ページが読み込まれたときのスクリーンショットです。デフォルトでは、選択したオプションとして試用版が表示されます。

62
Cybercop

IndexLicenseTypesを次のように1ではなく0から変更してみてください:

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)
81
Lin

EnumDropDownListForがレンダリングされるまでにSelectedLicenseには既にタイプのデフォルト値である0があります。

SelectedLicenseプロパティのタイプを次のようにnull可能な列挙型に変更するだけです。

public LicenseTypes? SelectedLicense { get; set; }

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

65

私は列挙型を持っています:

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"})

これにより、デフォルトのオプション「性別を選択」を含むドロップダウンが表示されますが、検証では、enumによって提供されるオプション(「男性」および「女性」)のみが受け入れられます。

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" })
16
rsobon

ViewModelクラスは、デフォルトの選択されたパブリックであるために、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>
}
10
Haroon

もう少し遅れますか?

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

どちらもモデルプロパティを変更してNULL可能にした後、[必須]属性を追加してNULLにできないようにします。

ViewBagを使用して、ドロップダウンのデフォルトの選択値を設定することを提案します。 重要なのは、以下のコントローラーの4行目だけです

EDIT:Ah ... newbies ...私の最初のアイデアは、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」行がない場合、デフォルトの選択値は「Select your music ...」ではなく「Metal」になります

0
Rikou