我使用的兩種方法(Chtiwi馬利克和rrejc)的混合早先提出,它的工作很好。
用這種方法,它會將data_id
轉換爲data-id
。它也會覆蓋你之前設置的默認屬性值。
using System.ComponentModel;
...
public static MvcHtmlString RequiredLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
{
var metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
string labelText = metaData.DisplayName ?? metaData.PropertyName ?? htmlFieldName.Split('.').Last();
if (String.IsNullOrEmpty(labelText))
return MvcHtmlString.Empty;
var label = new TagBuilder("label");
label.Attributes.Add("for", helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName));
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(htmlAttributes))
{
// By adding the 'true' as the third parameter, you can overwrite whatever default attribute you have set earlier.
label.MergeAttribute(prop.Name.Replace('_', '-'), prop.GetValue(htmlAttributes).ToString(), true);
}
label.InnerHtml = labelText;
return MvcHtmlString.Create(label.ToString());
}
請注意有關覆蓋在foreach中的代碼中具有默認值的屬性的註釋。
事實證明,您的示例比源代碼更豐富。我無法弄清楚源代碼是如何工作的,因爲它是一個IDictionary(就像你的標籤所做的那樣),但我試圖將它傳遞給匿名對象。一旦我看到你將它轉換爲RouteValueDictionary更有意義。 – 2009-10-07 20:46:55
這似乎不適用於像data_bind這樣的屬性 – SimonGates 2013-05-22 12:05:50