2012-04-13 12 views
3

Ich versuche also, diese Rasierersyntax in einer .cshtml-Ansicht in eine Hilfserweiterung in .cs umzuwandeln. Es gibt einen tollen Post hier bei Darin: https://stackoverflow.com/a/8187441/1026459. Ich habe jedoch einige Probleme damit, es zum Laufen zu bringen.Wie kann ich Html.BeginForm in einem benutzerdefinierten Helfer verwenden?

Dies ist die Ebene Auszeichnungs

@using (Html.BeginForm("Restore", "GlobalCrud")) 
{ 
@Html.Hidden("entityId", "Id") 
<input class="ui-icon ui-icon-power" type="submit" 
    onclick="return confirm('Clicking OK will restore this record');" 
/> 
} 

dies der Erweiterung ist

public static MvcHtmlString EditOrDelete(this HtmlHelper html) 
{ 
    var s = html.BeginForm(); 
    return MvcHtmlString.Create(s + " additional fields " + "</form>"); 
} 

dies die Verwendung ist:

@using namespace.CustomHelper 
@Html.EditOrDelete() 

Dies ist der Ausgang:

<form method="post" action="/Completed/Manage"> 
System.Web.Mvc.Html.MvcForm additional fields 
</form> 

Die Helfer Erweiterung zum größten Teil produziert, was ich brauche. Ich bin jedoch unsicher, wie ich das zurück in eine richtige HTML-Zeichenfolge konvertieren sollte. Die Rückgabe enthält System.Web.Mvc.Html.MvcForm im Text. Ich füge hier der Kürze halber " additional fields " hinzu, weil es dort kein Problem gibt. Die Hinzufügung von </form> ist dort, weil ich weiß, dass die normale using Aussage, die mit @Html.BeginForm() geht, das </form> Tag hinzufügt, wenn es disposed.

Wie kann ich das von .BeginForm generierte Formular ordnungsgemäß zurückgeben?

Antwort

5
public static class HtmlExtensions 
{ 
    public static void EditOrDelete(this HtmlHelper html) 
    { 
     using (html.BeginForm()) 
     { 
      html.ViewContext.Writer.Write("additional fields"); 
     } 
    } 
} 

und dann:

@using namespace.CustomHelper 
@{Html.EditOrDelete();} 

aussendet:

<form action="/" method="post">additional fields</form> 
+0

Danke Danke! Episch :) Ich hatte Probleme damit, tatsächlich etwas mit dem using-Statement innerhalb des Formulars erscheinen zu lassen, so dass das Ändern von Void nur natürlich erschien. Was ich vermisste war der ViewContext Writer. –

+0

+1 Liebe es, einfach und funktioniert! Ich kann jetzt automatisch den AntiForgeryToken mit meinem eigenen Formularhelfer einfügen – Darren

0

Aufrufen BeginForm rendert das Formular-Tag, so dass Sie nichts außer diese Methode aufrufen müssen.

public static MvcHtmlString EditOrDelete(this HtmlHelper html) 
{ 
    using(html.BeginForm()) 
    { 
     return MvcHtmlString.Create(" additional fields "); 
    } 
} 

Die using-Anweisung bewirkt, dass .Dispose() das Verfahren Returing vor aufgerufen werden, nach dem Schließen Formular-Tag der Zeichenfolge verursacht geschrieben. Schreiben Sie die Zeichenfolge stattdessen in die Antwort mit html.ViewContext.Writer.Write. (Siehe Darin Dimitrov's answer)

Einwickeln der Anruf in ein verwendet, wird die Endung Formular-Tag automatisch verursachen auch gerendert werden, wenn Dispose genannt wird.

+2

Das wird nicht funktionieren. Die zusätzlichen Felder werden außerhalb des Formulars im endgültigen Markup ausgegeben. –

+0

Sie haben Recht. Die using-Anweisung führt '.Dispose()' aus, bevor sie von der Methode zurückkehrt. –

Verwandte Themen