مدل زیر را در نظر بگیرید:
از View زیر جهت نمایش لیستی از شرکتها متناظر با مدل جاری استفاده میشود:
مشکلی که در کد بالا وجود دارد این است که با تغییر نام هر یک از متغییر هایمان ، اطلاعات گرید در ستون مربوطه نمایش داده نمیشود.همچنین عناوین ستونها نیز از DisplayName مدل پیروی نمیکنند.توسط متدهای الحاقی زیر این مشکل برطرف شده است.
جهت بدست آوردن نام متغییر هایمان استفاده مینماییم.
جهت بدست آوردن DisplayNameAttribute استفده میشود. درصورتیکه این DisplayNameAttribute یافت نشود نام متغییر بازگشت داده میشود.
بنابراین View مربوطه را اینگونه بازنویسی میکنیم:
/// <summary> /// /// </summary> public class CompanyModel { /// <summary> /// Table Identity /// </summary> public int Id { get; set; } /// <summary> /// Company Name /// </summary> [DisplayName("نام شرکت")] public string CompanyName { get; set; } /// <summary> /// Company Abbreviation /// </summary> [DisplayName("نام اختصاری شرکت")] public string CompanyAbbr { get; set; } }
@{ const string viewTitle = "شرکت ها"; ViewBag.Title = viewTitle; const string gridName = "companies-grid"; } <div class="col-md-12"> <div class="form-panel"> <header> <div class="title"> <i class="fa fa-book"></i> @viewTitle </div> </header> <div class="panel-body"> <div id="@gridName"> </div> </div> </div> </div> </div> @section scripts { <script type="text/javascript"> $(document).ready(function () { $("#@gridName").kendoGrid({ dataSource: { type: "json", transport: { read: { url: "@Html.Raw(Url.Action(MVC.Company.CompanyList()))", type: "POST", dataType: "json", contentType: "application/json" } }, schema: { data: "Data", total: "Total", errors: "Errors" } }, pageSize: 10, serverPaging: true, serverFiltering: true, serverSorting: true }, pageable: { refresh: true }, sortable: { mode: "multiple", allowUnsort: true }, editable: false, filterable: false, scrollable: false, columns: [ { field: "CompanyName", title: "نام شرکت", sortable: true, }, { field: "CompanyAbbr", title: "مخفف نام شرکت", sortable: true }] }); }); </script> }
مشکلی که در کد بالا وجود دارد این است که با تغییر نام هر یک از متغییر هایمان ، اطلاعات گرید در ستون مربوطه نمایش داده نمیشود.همچنین عناوین ستونها نیز از DisplayName مدل پیروی نمیکنند.توسط متدهای الحاقی زیر این مشکل برطرف شده است.
/// <summary> /// /// </summary> public static class PropertyExtensions { /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expression"></param> /// <returns></returns> public static MemberInfo GetMember<T>(this Expression<Func<T, object>> expression) { var mbody = expression.Body as MemberExpression; if (mbody != null) return mbody.Member; //This will handle Nullable<T> properties. var ubody = expression.Body as UnaryExpression; if (ubody != null) { mbody = ubody.Operand as MemberExpression; } if (mbody == null) { throw new ArgumentException("Expression is not a MemberExpression", "expression"); } return mbody.Member; } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expression"></param> /// <returns></returns> public static string PropertyName<T>(this Expression<Func<T, object>> expression) { return GetMember(expression).Name; } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expression"></param> /// <returns></returns> public static string PropertyDisplay<T>(this Expression<Func<T, object>> expression) { var propertyMember = GetMember(expression); var displayAttributes = propertyMember.GetCustomAttributes(typeof(DisplayNameAttribute), true); return displayAttributes.Length == 1 ? ((DisplayNameAttribute)displayAttributes[0]).DisplayName : propertyMember.Name; } }
public static string PropertyName<T>(this Expression<Func<T, object>> expression)
public static string PropertyDisplay<T>(this Expression<Func<T, object>> expression)
بنابراین View مربوطه را اینگونه بازنویسی میکنیم:
@using Models @{ const string viewTitle = "شرکت ها"; ViewBag.Title = viewTitle; const string gridName = "companies-grid"; } <div class="col-md-12"> <div class="form-panel"> <header> <div class="title"> <i class="fa fa-book"></i> @viewTitle </div> </header> <div class="panel-body"> <div id="@gridName"> </div> </div> </div> </div> </div> @section scripts { <script type="text/javascript"> $(document).ready(function () { $("#@gridName").kendoGrid({ dataSource: { type: "json", transport: { read: { url: "@Html.Raw(Url.Action(MVC.Company.CompanyList()))", type: "POST", dataType: "json", contentType: "application/json" } }, schema: { data: "Data", total: "Total", errors: "Errors" } }, pageSize: 10, serverPaging: true, serverFiltering: true, serverSorting: true }, pageable: { refresh: true }, sortable: { mode: "multiple", allowUnsort: true }, editable: false, filterable: false, scrollable: false, columns: [ { field: "@(PropertyExtensions.PropertyName<CompanyModel>(a => a.CompanyName))", title: "@(PropertyExtensions.PropertyDisplay<CompanyModel>(a => a.CompanyName))", sortable: true, }, { field: "@(PropertyExtensions.PropertyName<CompanyModel>(a => a.CompanyAbbr))", title: "@(PropertyExtensions.PropertyDisplay<CompanyModel>(a => a.CompanyAbbr))", sortable: true }] }); }); </script> }