Question

J'écris mon premier asp.net et je demande mvc une question sur les aides Html personnalisés:

Pour faire un formulaire, vous pouvez utiliser:

<% using (Html.BeginForm()) {%>
   *stuff here*
<% } %>

Je voudrais faire quelque chose de similaire avec un assistant HTML personnalisé. En d'autres termes, je veux changer:

Html.BeginTr();
Html.Td(day.Description);
Html.EndTr();

dans:

using Html.BeginTr(){
    Html.Td(day.Description);
}

Est-ce possible?

Était-ce utile?

La solution

Voici une implémentation réutilisable possible en C #:

class DisposableHelper : IDisposable
{
    private Action end;

    // When the object is created, write "begin" function
    public DisposableHelper(Action begin, Action end)
    {
        this.end = end;
        begin();
    }

    // When the object is disposed (end of using block), write "end" function
    public void Dispose()
    {
        end();
    }
}

public static class DisposableExtensions
{
    public static IDisposable DisposableTr(this HtmlHelper htmlHelper)
    {
        return new DisposableHelper(
            () => htmlHelper.BeginTr(),
            () => htmlHelper.EndTr()
        );
    }
}

Dans ce cas, et BeginTr écrire directement dans EndTr le flux de réponse. Si vous utilisez des méthodes d'extension qui renvoient une chaîne, vous devrez les sorties en utilisant:

htmlHelper.ViewContext.HttpContext.Response.Write(s)

Autres conseils

J'ai essayé suivant les conseils donnés ici à MVC3, mais je suis tombé sur la difficulté à utiliser:

htmlHelper.ViewContext.HttpContext.Response.Write(...);

Quand j'utilisé ce code, mon aide a été écrit dans le flux de réponse avant ma mise en page a été rendue. Cela ne fonctionne pas bien.

Au lieu de cela je ceci:

htmlHelper.ViewContext.Writer.Write(...);

Si vous regardez la source pour le ASP.NET MVC (disponible sur Codeplex ), vous verrez la mise en œuvre du BeginForm appelle finalement vers le code suivant:

static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
{
    TagBuilder builder = new TagBuilder("form");
    builder.MergeAttributes<string, object>(htmlAttributes);
    builder.MergeAttribute("action", formAction);
    builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
    htmlHelper.ViewContext.HttpContext.Response.Write(builder.ToString(TagRenderMode.StartTag));

    return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
}

La classe MvcForm implémente IDisposable, dans sa méthode est écrit le Éliminez à la réponse.

Alors, ce que vous devez faire est d'écrire les balises que vous voulez dans la méthode d'aide et retourner un objet qui implémente IDisposable ... dans sa méthode Éliminez fermer la balise off.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top