2014-10-07 6 views
5

ich einen benutzerdefinierten Helfer muß fusionieren, wo ich ein Htmlattributes als Parameter erhalten:Wie Htmlattributes in der kundenspezifischen Helper

public static MvcHtmlString Campo<TModel, TValue>(
      this HtmlHelper<TModel> helper, 
      Expression<Func<TModel, TValue>> expression, 
      dynamic htmlAttributes = null) 
{ 
    var attr = MergeAnonymous(new { @class = "form-control"}, htmlAttributes); 
    var editor = helper.EditorFor(expression, new { htmlAttributes = attr }); 
    ... 
} 

Die MergeAnonymous Verfahren den fusioniert Htmlattributes erhielten in Parameter mit „neuer {@ Klasse =“ return muss Form -control "}":

static dynamic MergeAnonymous(dynamic obj1, dynamic obj2) 
{ 
    var dict1 = new RouteValueDictionary(obj1); 

    if (obj2 != null) 
    { 
     var dict2 = new RouteValueDictionary(obj2); 

     foreach (var pair in dict2) 
     { 
      dict1[pair.Key] = pair.Value; 
     } 
    } 

    return dict1; 
} 

Und im Editor-Vorlage für ein Beispiel Feld muss ich einige weitere Attribute hinzufügen:

@model decimal? 

@{ 
    var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]); 
    htmlAttributes["class"] += " inputmask-decimal"; 
} 

@Html.TextBox("", string.Format("{0:c}", Model.ToString()), htmlAttributes) 

Was ich in Htmlattributes im letzten Zeile in Editor-Vorlage habe, ist:

Click here to see the image

Beachten Sie, dass die „Klasse“ richtig erscheinen, aber die anderen Attribute aus der Extension Helper sind in einem Wörterbuch, was ist Ich mache falsch?

Wenn möglich, möchte ich nur Verlängerungs Helfer und nicht Editor-Vorlage ändern, so dass ich denke, die Routevaluedictionary zu EditorFor geben müssen ein anonymes Objekt werfen ...

+0

https://cpratt.co/html-editorfor-and-htmlattributes/ –

Antwort

4

ich jetzt zu ändern alle meine Editor Vorlagen gelöst die Linie:

var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]); 

hierfür:

var htmlAttributes = ViewData["htmlAttributes"] as IDictionary<string, object> ?? HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]); 

und die MergeAnonymous Methode dazu:

static IDictionary<string,object> MergeAnonymous(object obj1, object obj2) 
{ 
    var dict1 = new RouteValueDictionary(obj1); 
    var dict2 = new RouteValueDictionary(obj2); 
    IDictionary<string, object> result = new Dictionary<string, object>(); 

    foreach (var pair in dict1.Concat(dict2)) 
    { 
     result.Add(pair); 
    } 

    return result; 
} 
-1
public static class CustomHelper 
    { 
     public static MvcHtmlString Custom(this HtmlHelper helper, string tagBuilder, object htmlAttributes) 
     { 
      var builder = new TagBuilder(tagBuilder); 

      RouteValueDictionary customAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 

      foreach (KeyValuePair<string, object> customAttribute in customAttributes) 
      { 
       builder.MergeAttribute(customAttribute.Key.ToString(), customAttribute.Value.ToString()); 
      } 

      return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing)); 
     } 
    } 
+1

Sie sollten erklären, wie das sein Problem behebt – adao7000