داشتن DisplayNameFor اختصاصی
سلام
آیا می توان برای برنامه ای DisplayNameFor اختصاصی طراحی کنم مثلا رنگ پس زمینه ان ابی باشد
اگربله چگونه باید انجام بدهم
5 پاسخ
سلام
کد زیر را نوشتم
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
namespace Appliction
{
public static MvcHtmlString MyDisplayFor<TModel, TProperty>(this HtmlHelper helper, Expression<Func<TModel, TProperty>> selector)
{
var memberExpression = selector.Body as MemberExpression;
if (memberExpression == null)
throw new ArgumentException();
var displayName = memberExpression.Member.GetCustomAttribute<DisplayAttribute>()?.Name ?? memberExpression.Member.Name;
var tagBuilder = new TagBuilder("label");
tagBuilder.SetInnerText(displayName);
tagBuilder.AddCssClass("blue-back");
// or set style by style attribute
// tagBuilder.Attributes.Add("style", "background-color: blue;");
return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
}
}
خطا زیر را می دهد
A namespace cannot directly contain members such as fields or methods
Extension method must be defined in a non-generic static class
حال چگونه می توانم در view استفاده کنم
سلام، وقت بخیر
برای اینکار می تونید یک Extension Method به صورت زیر بنویسید و عملیات DisplayNameFor رو Customize و یا Extend کنید که پیاده سازی بر اساس نیازتون باید باشه، مثال ساده زیر فقط Background رو آبی می کنه (فقط من کد رو نتونستم تست کنم، اگر جایی مشکلی داشت بگید که بررسیش کنیم)
public static MvcHtmlString MyDisplayFor<TModel, TProperty>(this HtmlHelper helper, Expression<Func<TModel, TProperty>> selector)
{
var memberExpression = selector.Body as MemberExpression;
if (memberExpression == null)
throw new ArgumentException();
var displayName = memberExpression.Member.GetCustomAttribute<DisplayAttribute>()?.Name ?? memberExpression.Member.Name;
var tagBuilder = new TagBuilder("label");
tagBuilder.SetInnerText(displayName);
tagBuilder.AddCssClass("blue-back");
// or set style by style attribute
// tagBuilder.Attributes.Add("style", "background-color: blue;");
return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
}
این کد یک Extension Method هست، به صورت زیر می تونید ازش استفاده کنید:
@Html.MyDisplayFor(m=>m.Username)
فقط لطفاً بعد از اینکه به جواب رسیدید پست هایی که جواب هستند رو به عنوان جواب انتخاب کنید تا سوالات بعدیتون هم به جواب برسه.
شما نمی تونی مستقیم داخل Namespace متد تعریف کنی. باید یک کلاس باشه!!!!
public static class ExtensionMethods
{
public static MvcHtmlString MyDisplayFor<TModel, TProperty>(this HtmlHelper helper, Expression<Func<TModel, TProperty>> selector)
{
var memberExpression = selector.Body as MemberExpression;
if (memberExpression == null)
throw new ArgumentException();
var displayName = memberExpression.Member.GetCustomAttribute<DisplayAttribute>()?.Name ?? memberExpression.Member.Name;
var tagBuilder = new TagBuilder("label");
tagBuilder.SetInnerText(displayName);
tagBuilder.AddCssClass("blue-back");
// or set style by style attribute
// tagBuilder.Attributes.Add("style", "background-color: blue;");
return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
}
}
پیشنهاد می کنم یکبار مفاهیم مربوط به کلاس ها و شئ گرایی رو مطالعه کنید!