2017-05-08 1 views
1

J'essaye de créer un helper HTML personnalisé avec ASP.NET MVC. J'ai le code suivant:Comment puis-je utiliser @HtmlHelper dans un @HtmlHelper personnalisé?

@helper DefaultRenderer(Models.Control control) 
{ 
    <div class="form-group"> 
    <label class="control-label" for="@control.Name">@control.Label</label> 
    @Html.TextBoxFor(m => control.Value, new { @class = "form-control" }) 
    </div> 
} 

Apparemment @ Html.TextBoxFor ne peut pas être trouvé à l'intérieur de la classe d'un assistant. Je peux l'utiliser dans une vue partielle qui est aussi une classe .cshtml.

je peux utiliser @HtmlTextBox mais je vais perdre le modèle de liaison forte ...

Pourquoi cela se produit et est-il un moyen de le faire fonctionner?

Répondre

1

Non, ce n'est pas possible. Vous ne pouvez pas écrire un HTML normal helper avec @Html.TextBoxFor car votre vue est fortement typée. Vous avez donc besoin quelque chose comme:

public class HelperExtentions{ 

    public static MvcHtmlString DefaultRenderer<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Control control , object htmlAttributes) 
     { 
      var sb = new StringBuilder(); 
      var dtp = htmlHelper.TextBoxFor(expression, htmlAttributes).ToHtmlString(); 
      sb.AppendFormat("<div class='form-group'><label class='control-label' for='{1}'>{2}</label>{0}</div>", dtp,control.Name,control.Label); 
      return MvcHtmlString.Create(sb.ToString()); 
     } 
} 

Ensuite, vous pouvez utiliser:

@html.DefaultRenderer(m => m.Control.Value, Models.Control,new { @class = "form-control" }