中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

愛上(shang)MVC~為DisplayNameFor添加擴展,支持PagedList集合

回到目錄

DisplayNameFor方(fang)(fang)法(fa)是MVC提供給我(wo)們的(de)(de)(de)(de),它(ta)可(ke)以(yi)(yi)將(jiang)模型的(de)(de)(de)(de)DisplayName特性的(de)(de)(de)(de)值顯(xian)(xian)示(shi)(shi)到頁面(mian)上,這對程(cheng)序員來(lai)說很是方(fang)(fang)便,在進行實體設計時,可(ke)以(yi)(yi)指定它(ta)的(de)(de)(de)(de)顯(xian)(xian)示(shi)(shi)名稱,然后(hou)MVC引擎(qing)會(hui)自動幫(bang)助我(wo)們生成(cheng)DisplayNameFor代碼斷,而(er)(er)我(wo)們的(de)(de)(de)(de)所有字段的(de)(de)(de)(de)名稱就顯(xian)(xian)示(shi)(shi)到了頁面(mian)上,一切就這樣(yang)簡(jian)單,即使你在列表頁,你的(de)(de)(de)(de)模型IEnumerable<T>也可(ke)以(yi)(yi)很容(rong)易的(de)(de)(de)(de)被支(zhi)持(chi),而(er)(er)在大叔(shu)框架(jia)里,分頁列表使用了模型PagedList<T>,這當然不(bu)會(hui)被微軟兼(jian)容(rong),所以(yi)(yi),大叔(shu)為(wei)些(xie)特意為(wei)DisplayNameFor這個(ge)方(fang)(fang)法(fa)寫了一個(ge)擴展,讓它(ta)支(zhi)持(chi)大叔(shu)的(de)(de)(de)(de)分頁,并且支(zhi)持(chi)導航屬性的(de)(de)(de)(de)DisplayName,例如,UserInfo.UserExtension.NickName,它(ta)就會(hui)把UserExtension類的(de)(de)(de)(de)NickName字段的(de)(de)(de)(de)描述信(xin)息顯(xian)(xian)示(shi)(shi)出來(lai)!

代碼屬于擴展方法,所以要寫在靜態(tai)類中,呵(he)呵(he)

    /// <summary>
    /// 大叔為(wei)DisplayName進行了擴展
    /// </summary>
    public static class DisplayNameExtensions
    {

        /// <summary>
        /// 顯示字段的(de)名稱DisplayName的(de)值
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <typeparam name="TValue"></typeparam>
        /// <param name="html"></param>
        /// <param name="expression"></param>
        /// <returns></returns>
        public static MvcHtmlString DisplayNameFor<TModel, TValue>(this HtmlHelper<PagedList<TModel>> html, Expression<Func<TModel, TValue>> expression)
        {
            Type t = typeof(TModel);
            // string propertyName = GetPropertyName<TModel, TValue>(expression);

            var complex = ExpressionHelper.GetExpressionText(expression).Split('.');
            string propertyName = complex.Last();
            if (complex.Count() > 1)
            {
                t = t.GetProperty(complex[complex.Length - 2]).PropertyType;
            }
            var p = t.GetProperty(propertyName);
            if (p != null)
            {
                var attr1 = p.GetCustomAttribute(typeof(DisplayNameAttribute));
                var attr2 = p.GetCustomAttribute(typeof(DisplayAttribute));
                if (attr1 != null)
                {
                    return MvcHtmlString.Create(((System.ComponentModel.DisplayNameAttribute)attr1).DisplayName);
                }
                if (attr2 != null)
                {
                    return MvcHtmlString.Create(((DisplayAttribute)attr2).Name);
                }
            }
            return MvcHtmlString.Create(string.Empty);
        }

        public static MvcHtmlString DisplayNameFor<TModel, TEnumerable, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, PagedList<TEnumerable>>> enumerableExpression, Expression<Func<TEnumerable, TValue>> valueExpression)
        {
            var metadata = ModelMetadata.FromLambdaExpression(valueExpression, new ViewDataDictionary<TEnumerable>());
            string displayName = metadata.DisplayName ?? metadata.PropertyName ?? ExpressionHelper.GetExpressionText(valueExpression).Split('.').Last();
            return new MvcHtmlString(HttpUtility.HtmlEncode(displayName));
        }


    }

運行的結果如圖

其實(shi),在進行建立和編輯(ji)時,MVC為我們的DisplayNameFor已(yi)經實(shi)現(xian)了導航屬性的字段顯示功(gong)能(neng),這個也是我在測試之后才發現(xian)的,呵(he)呵(he)

有一點(dian)還是要注意的(de),在(zai)(zai)表(biao)單元素上(shang),你的(de)導航屬性的(de)字(zi)段(duan)命(ming)名(ming)(ming)是類名(ming)(ming)+字(zi)段(duan)名(ming)(ming),而(er)在(zai)(zai)id和name這兩個(ge)標簽中,又(you)有不同(tong),id是類名(ming)(ming)與字(zi)段(duan)之間用“下劃線”分(fen)開,而(er)name是用“點(dian)”分(fen)開的(de),這點(dian)大家要清晰!

這一點(dian)如果(guo)Action在(zai)接收時使用的(de)(de)是FormCollection或者直(zhi)接Request.Form時,就需要大家特別(bie)注意了,它們(men)請(qing)求的(de)(de)是表單(dan)的(de)(de)name,而不是id,我(wo)們(men)可以從圖(tu)中清晰(xi)的(de)(de)看到

而如果你(ni)的action中,參數使(shi)用的是(shi)實體,那么MVC會幫(bang)助我(wo)們自動進行(xing)填充,省事了,呵呵!

好了(le)(le),不早了(le)(le),今(jin)天的MVC就(jiu)說到這(zhe)里了(le)(le)!

感謝您的閱讀!

回到目錄

posted @ 2015-10-26 23:12  張占嶺  閱讀(2756)  評論(1)    收藏  舉報