最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET?MVC下拉框中顯示枚舉項(xiàng)

 更新時(shí)間:2022年07月31日 14:44:35   作者:Darren?Ji  
這篇文章介紹了ASP.NET?MVC下拉框中顯示枚舉項(xiàng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

本篇將通過(guò)3種方式,把枚舉項(xiàng)上的自定義屬性填充到下拉框:
1、通過(guò)控制器返回List<SelectListItem>類型給前臺(tái)視圖
2、通過(guò)為枚舉類型屬性打上UIHint屬性讓模版顯示枚舉項(xiàng)
3、通過(guò)自定義元數(shù)據(jù)提供器DataAnnotationsModelMetadataProvider讓模版顯示枚舉項(xiàng)

我們經(jīng)常會(huì)把類型為Int16的屬性通過(guò)枚舉來(lái)獲得。比如:

public class SomeClass
{
    public int16 Status{get;set;}
}

對(duì)應(yīng)的枚舉:

public enum StatusEnum
{
    Enable = 0,
    Disable = 1
}

在MVC視圖中可能會(huì)這樣寫:

<select id="sel">
   <option value="">==選擇狀態(tài)==</option>
   <option value="0">啟用</option>
   <option value="1">禁用</option>
</select>

如果枚舉的項(xiàng)發(fā)生變化怎么辦?比如:

public enum StatusEnum
{
    Enable = 0,
    Disable = 1,
    NeverComeback = 2
}

如果修改每一頁(yè)的代碼,顯然是不合理的。最理想的做法是:為每一個(gè)枚舉項(xiàng)打上屬性,顯示的時(shí)候直接讀取枚舉以及枚舉項(xiàng)屬性值。

通過(guò)控制器返回List<SelectListItem>類型給前臺(tái)視圖

定義一個(gè)Model,其中有一個(gè)類型為Int16的屬性Status,這個(gè)屬性用來(lái)接收枚舉值。

using System;
using System.ComponentModel.DataAnnotations;
 
namespace MvcApplication1.Models
{
    public class Stadium
    {
        public int Id { get; set; }
 
        [Display(Name = "場(chǎng)館名稱")]
        public string Name { get; set; }
 
        [Display(Name = "是否啟用")]
        public Int16 Status { get; set; }
    }
}

為每個(gè)枚舉項(xiàng)打上的屬性需要我們自定義,通過(guò)構(gòu)造函數(shù)接收名稱,并提供一個(gè)屬性供外部訪問(wèn)。

using System;
 
namespace MvcApplication1.Extension
{
    public class EnumDisplayNameAttribute : Attribute
    {
        private string _displayName;
 
        public EnumDisplayNameAttribute(string displayName)
        {
            this._displayName = displayName;
        }
 
        public string DisplayName
        {
            get { return _displayName; }
        }
    }
}

為每個(gè)枚舉項(xiàng)打上自定義屬性。

using MvcApplication1.Extension;
 
namespace MvcApplication1.Models.Enum
{
    public enum StatusEnum
    {
        [EnumDisplayName("啟用")]
        Enable = 0,
        [EnumDisplayName("禁用")]
        Disable =  1
    }
}

我們的目的是在控制器獲取List<SelectListItem>集合,然后傳遞到前臺(tái)視圖?,F(xiàn)在,枚舉和枚舉項(xiàng)上的自定義屬性都有了,有必要?jiǎng)?chuàng)建一個(gè)幫助類來(lái)幫我們獲取List<SelectListItem>集合。

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Web.Mvc;
 
namespace MvcApplication1.Extension
{
    public class EnumExt
    {
        /// <summary>
        /// 根據(jù)枚舉成員獲取自定義屬性EnumDisplayNameAttribute的屬性DisplayName
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        public static string GetEnumCustomDescription(object e)
        {
            //獲取枚舉的Type類型對(duì)象
            Type t = e.GetType();
 
            //獲取枚舉的所有字段
            FieldInfo[] ms = t.GetFields();
 
            //遍歷所有枚舉的所有字段
            foreach (FieldInfo f in ms)
            {
                if (f.Name != e.ToString())
                {
                    continue;
                }
 
                //第二個(gè)參數(shù)true表示查找EnumDisplayNameAttribute的繼承鏈
                if (f.IsDefined(typeof (EnumDisplayNameAttribute), true))
                {
                    return
                        (f.GetCustomAttributes(typeof(EnumDisplayNameAttribute), true)[0] as EnumDisplayNameAttribute)
                            .DisplayName;
                }
            }
 
            //如果沒(méi)有找到自定義屬性,直接返回屬性項(xiàng)的名稱
            return e.ToString();
        }
 
        /// <summary>
        /// 根據(jù)枚舉,把枚舉自定義特性EnumDisplayNameAttribut的Display屬性值撞到SelectListItem中
        /// </summary>
        /// <param name="enumType">枚舉</param>
        /// <returns></returns>
        public static List<SelectListItem> GetSelectList(Type enumType)
        {
            List<SelectListItem> selectList = new List<SelectListItem>();
            foreach (object e in Enum.GetValues(enumType))
            {
                selectList.Add(new SelectListItem(){Text = GetEnumCustomDescription(e),Value = ((int)e).ToString()});
            }
            return selectList;
        }
    }
}

在控制器中,通過(guò)ViewData把List<SelectListItem>集合往前臺(tái)傳??刂破靼?個(gè)方法,一個(gè)方法用來(lái)顯示創(chuàng)建視圖界面,另一個(gè)用來(lái)顯示編輯視圖界面。

        //創(chuàng)建
        public ActionResult Index()
        {
            ViewData["s"] = EnumExt.GetSelectList(typeof (StatusEnum));
            return View(new Stadium());
        }
 
        //編輯
        public ActionResult Edit()
        {
            Stadium s = new Stadium()
            {
                Id = 2,
                Name = "水立方",
                Status = (short)StatusEnum.Disable
            };
            ViewData["s"] = EnumExt.GetSelectList(typeof(StatusEnum));
            return View(s);
        }

在強(qiáng)類型的創(chuàng)建視圖界面中,通過(guò)@Html.DropDownListFor(model => model.Status,(List<SelectListItem>)ViewData["s"])接收來(lái)自控制器的數(shù)據(jù)。

@model MvcApplication1.Models.Stadium
 
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
 
<h2>Index</h2>
 
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
 
    <fieldset>
        <legend>Stadium</legend>
 
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
 
        <div class="editor-label">
            @Html.LabelFor(model => model.Status)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.Status,(List<SelectListItem>)ViewData["s"])
            @Html.ValidationMessageFor(model => model.Status)
        </div>
 
        <p>
            <input type="submit" value="添加" />
        </p>
    </fieldset>
}
 
 
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

在強(qiáng)類型的編輯視圖界面中,同樣通過(guò)@Html.DropDownListFor(model => model.Status,(List<SelectListItem>)ViewData["s"])接收來(lái)自控制器的數(shù)據(jù)。

@model MvcApplication1.Models.Stadium
 
@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
 
<h2>Edit</h2>
 
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
 
    <fieldset>
        <legend>Stadium</legend>
 
        @Html.HiddenFor(model => model.Id)
 
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
 
        <div class="editor-label">
            @Html.LabelFor(model => model.Status)
        </div>
        <div class="editor-field">
             @Html.DropDownListFor(model => model.Status,(List<SelectListItem>)ViewData["s"])
            @Html.ValidationMessageFor(model => model.Status)
        </div>
 
        <p>
            <input type="submit" value="編輯" />
        </p>
    </fieldset>
}
 
 
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

創(chuàng)建界面:

編輯界面:

通過(guò)為枚舉類型屬性打上UIHint屬性讓模版顯示枚舉項(xiàng)

由于模版是根據(jù)屬性類型來(lái)判斷的,再定義一個(gè)Model,其中一個(gè)屬性類型是枚舉。

using System.ComponentModel.DataAnnotations;
using MvcApplication1.Models.Enum;
 
namespace MvcApplication1.Models
{
    public class Stadium1
    {
        public int Id { get; set; }
 
        [Display(Name = "場(chǎng)館名稱")]
        public string Name { get; set; }
 
        [Display(Name = "是否啟用")]
        public StatusEnum Status { get; set; } 
    }
}

在Views/Shared/EditorTemplates文件夾下創(chuàng)建Enum.cshtml,用來(lái)處理類型為Enum的屬性。

@using System.ComponentModel.DataAnnotations
@using System.Reflection
@using MvcApplication1.Extension
 
@{
    var selectList = new List<SelectListItem>();
    string optionLabel = null;
    object htmlAttributes = null;
    var enumType = (Type)Model.GetType();
    foreach (var value in Enum.GetValues(enumType))
    {
        var field = enumType.GetField(value.ToString());
        var option = new SelectListItem() {Value = value.ToString()};
        var display = field.GetCustomAttributes(typeof (EnumDisplayNameAttribute), false).FirstOrDefault() as EnumDisplayNameAttribute;
        if (display != null)
        {
            option.Text = display.DisplayName;
        }
        else
        {
            option.Text = value.ToString();
        }
        option.Selected = object.Equals(value, Model);
        selectList.Add(option);
    }
}
 
@Html.DropDownList("",selectList, optionLabel, htmlAttributes)

控制器中有2個(gè)方法用來(lái)顯示創(chuàng)建和編輯視圖界面。

        //創(chuàng)建
        public ActionResult TemplateCreate()
        {
            return View(new Stadium1());
        }
 
        //編輯
        public ActionResult TemplateEdit()
        {
            Stadium1 s = new Stadium1()
            {
                Id = 2,
                Name = "水立方",
                Status = StatusEnum.Disable
            };
            return View(s);
        }

強(qiáng)類型的創(chuàng)建視圖界面:

@model MvcApplication1.Models.Stadium1
 
@{
    ViewBag.Title = "TemplateCreate";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
 
<h2>TemplateCreate</h2>
 
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
 
    <fieldset>
        <legend>Stadium</legend>
 
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
 
        <div class="editor-label">
            @Html.LabelFor(model => model.Status)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Status)
            @Html.ValidationMessageFor(model => model.Status)
        </div>
 
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}
 
 
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

強(qiáng)類型的編輯視圖界面:

@model MvcApplication1.Models.Stadium1
 
@{
    ViewBag.Title = "TemplateEdit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
 
<h2>TemplateEdit</h2>
 
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
 
    <fieldset>
        <legend>Stadium</legend>
 
        @Html.HiddenFor(model => model.Id)
 
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
 
        <div class="editor-label">
            @Html.LabelFor(model => model.Status)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Status)
            @Html.ValidationMessageFor(model => model.Status)
        </div>
 
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
 
 
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

最后,給Stadium1的枚舉屬性,打上UIHint屬性,指明使用公共Enum類型模版Views/Shared/EditorTemplates/Enum.cshtml。

using System.ComponentModel.DataAnnotations;
using MvcApplication1.Models.Enum;
 
namespace MvcApplication1.Models
{
    public class Stadium1
    {
        public int Id { get; set; }
 
        [Display(Name = "場(chǎng)館名稱")]
        public string Name { get; set; }
 
        [Display(Name = "是否啟用")]
        [UIHint("Enum")]
        public StatusEnum Status { get; set; } 
    }
}

創(chuàng)建視圖界面:

編輯視圖界面:

通過(guò)自定義元數(shù)據(jù)提供器DataAnnotationsModelMetadataProvider讓模版顯示枚舉項(xiàng)

如果覺得為屬性打上[UIHint("Enum")]屬性麻煩的話,還可以通過(guò)數(shù)據(jù)提供器,為所有類型為Enum的屬性指明模版。

當(dāng)然自定義的元數(shù)據(jù)提供器是需要在全局中注冊(cè)的。

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
 
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
 
            //注冊(cè)自定義元數(shù)據(jù)提供其
            ModelMetadataProviders.Current = new CustomMetadataProvider();
        }
    }

現(xiàn)在可以把Stadium的[UIHint("Enum")]注釋掉。

總結(jié)

如果,我們想在下拉框中顯示枚舉項(xiàng),首先給枚舉項(xiàng)打上自定義屬性,通過(guò)反射可以拿到自定義屬性的相關(guān)屬性值。

如果,想在控制器方法中獲取List<SelectListItem>集合往前臺(tái)傳,我們可以封裝一個(gè)方法,根據(jù)枚舉返回List<SelectListItem>集合;

如果想根據(jù)屬性的類型顯示枚舉模版,要么給枚舉屬性打上[UIHint("Enum")],要么在全局自定義一個(gè)DataAnnotationsModelMetadataProvider。

到此這篇關(guān)于ASP.NET MVC下拉框中顯示枚舉項(xiàng)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • asp.net 添加水印的代碼(已測(cè)試)

    asp.net 添加水印的代碼(已測(cè)試)

    添加水印的代碼 測(cè)試 調(diào)試 結(jié)果 經(jīng)過(guò)本人親自測(cè)試
    2010-03-03
  • linq to sql 中,如何解決多條件查詢問(wèn)題,答案,用表達(dá)式樹! (下)

    linq to sql 中,如何解決多條件查詢問(wèn)題,答案,用表達(dá)式樹! (下)

    在上一篇中,我們做了基于linq to sql 的多條件組合查詢,但通過(guò)監(jiān)視數(shù)據(jù)庫(kù)發(fā)現(xiàn),這樣做的成本比較高,每次都要取出全部的數(shù)據(jù)到內(nèi)存進(jìn)行篩選.
    2011-08-08
  • asp.net 預(yù)防SQL注入攻擊之我見

    asp.net 預(yù)防SQL注入攻擊之我見

    說(shuō)起防止SQL注入攻擊,感覺很郁悶,這么多年了大家一直在討論,也一直在爭(zhēng)論,可是到了現(xiàn)在似乎還是沒(méi)有定論。當(dāng)不知道注入原理的時(shí)候會(huì)覺得很神奇,怎么就被注入了呢?會(huì)覺得很難預(yù)防。但是當(dāng)知道了注入原理之后預(yù)防不就是很簡(jiǎn)單的事情了嗎?
    2009-11-11
  • 導(dǎo)致Asp.Net站點(diǎn)重啟10個(gè)原因小結(jié)分析

    導(dǎo)致Asp.Net站點(diǎn)重啟10個(gè)原因小結(jié)分析

    Asp.Net站點(diǎn)有時(shí)候會(huì)莫名其妙的重啟,什么原因?qū)е碌膮s不得而知,經(jīng)過(guò)一番折騰后,我總結(jié)了導(dǎo)致Asp.Net站點(diǎn)重啟的10個(gè)原因,需要的朋友可以參考下。
    2011-08-08
  • asp.net 關(guān)于==?:和if()else()條件判斷等效例子

    asp.net 關(guān)于==?:和if()else()條件判斷等效例子

    關(guān)于==?:和if()else() 等效例子
    2010-03-03
  • asp.net關(guān)于Cookie跨域(域名)的問(wèn)題

    asp.net關(guān)于Cookie跨域(域名)的問(wèn)題

    Cookie是一個(gè)偉大的發(fā)明,它允許Web開發(fā)者保留他們的用戶的登錄狀態(tài)。但是當(dāng)你的站點(diǎn)有一個(gè)以上的域名時(shí)就會(huì)出現(xiàn)問(wèn)題了。在Cookie規(guī)范上說(shuō),一個(gè)cookie只能用于一個(gè)域名,不能夠發(fā)給其它的域名。因此,如果在瀏覽器中對(duì)一個(gè)域名設(shè)置了一個(gè)cookie,這個(gè)cookie對(duì)于其它的域名將無(wú)效。如果你想讓你的用戶從你的站點(diǎn)中的其中一個(gè)進(jìn)行登錄,同時(shí)也可以在其它域名上進(jìn)行登錄,這可真是一個(gè)大難題。
    2012-12-12
  • asp.net 細(xì)說(shuō)文件讀寫操作(讀寫鎖)

    asp.net 細(xì)說(shuō)文件讀寫操作(讀寫鎖)

    開發(fā)過(guò)程中,我們玩玩需要大量與文件交互,讀文件,寫文件已成家常便飯,本地運(yùn)行完美,但一上到投產(chǎn)環(huán)境,往往會(huì)出現(xiàn)很多令人措手不及的意外,或開發(fā)中的煩惱,因此,我對(duì)普通的C#文件操作做了一次總結(jié)
    2011-12-12
  • DataGridView展開與收縮功能實(shí)現(xiàn)

    DataGridView展開與收縮功能實(shí)現(xiàn)

    我們今天將要講到DataGridView之行的展開與收縮,包括功能是如何實(shí)現(xiàn)的,感興趣的小伙伴們可以參考一下
    2015-09-09
  • asp.net使用DataTable構(gòu)造Json字符串的方法

    asp.net使用DataTable構(gòu)造Json字符串的方法

    這篇文章主要介紹了asp.net使用DataTable構(gòu)造Json字符串的方法,涉及asp.net字符串序列化、遍歷及構(gòu)造等操作技巧,需要的朋友可以參考下
    2015-12-12
  • 詳解IIS在ASP.NET?Core下的兩種部署模式

    詳解IIS在ASP.NET?Core下的兩種部署模式

    ASP.NET?CORE應(yīng)用針對(duì)IIS具有兩種部署模式,它們都依賴于一個(gè)IIS針對(duì)ASP.NET?CORE?Core的擴(kuò)展模塊,本文給大家介紹下IIS在ASP.NET?Core下的兩種部署模式,感興趣的朋友一起看看吧
    2022-03-03

最新評(píng)論

土默特右旗| 綦江县| 梓潼县| 宜兰县| 江油市| 溧水县| 麦盖提县| 张家界市| 滦平县| 青海省| 胶南市| 娄烦县| 临朐县| 谢通门县| 南汇区| 夏津县| 仁怀市| 观塘区| 五台县| 咸宁市| 阳新县| 渝北区| 会东县| 丘北县| 绵阳市| 东方市| 十堰市| 广丰县| 平利县| 日喀则市| 青田县| 六安市| 呼伦贝尔市| 大冶市| 灵璧县| 方山县| 拜城县| 庄浪县| 丰顺县| 宁德市| 乐安县|