2012-04-13 63 views
3

所以我試圖將.cshtml視圖中的這個剃刀語法轉換爲.cs中的助手擴展。 Darin在這裏有一個很棒的帖子:https://stackoverflow.com/a/8187441/1026459。但是,我有一些問題得到它的工作。如何在自定義助手中使用Html.BeginForm?

這是普通的標記

@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');" 
/> 
} 

這是進一步擴展

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

這是利用:

@using namespace.CustomHelper 
@Html.EditOrDelete() 

這是輸出:

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

大部分的幫手延伸產生我需要的東西。但是,我不確定我應該如何將其轉換回適當的html字符串。退貨包括文中的System.Web.Mvc.Html.MvcForm。我在這裏加入" additional fields "是因爲這裏沒有問題。 </form>的增加是因爲我知道,與@Html.BeginForm()一起使用的正常using聲明在處理時添加了</form>標記。

如何正確返回由.BeginForm生成的表單?

回答

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

然後:

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

發出:

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

謝謝Darin!史詩:)我有問題,實際上設法讓使用using語句出現在窗體內的任何東西,所以改變它無效似乎只是自然。我錯過的是ViewContext作家。 – 2012-04-13 22:01:06

+0

+1喜歡它,簡單而有效!我現在可以用我自己的表單助手自動插入AntiForgeryToken – Darren 2012-11-02 10:47:00

0

調用BeginForm呈現表單標記,因此除了調用該方法之外,您不需要執行任何操作。

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

using語句會導致.Dispose()之前要方法returing叫,造成串閉幕表單標籤後寫的。改爲使用html.ViewContext.Writer.Write將該字符串寫入響應。 (請參閱Darin Dimitrov's answer

在調用Dispose時,在使用中包裝調用會自動導致結尾窗體標記也被呈現。

+2

這是行不通的。其他字段將在最終標記中的表格之外發送。 – 2012-04-13 21:54:49

+0

你說得對。使用語句在從方法返回之前正在執行'.Dispose()'。 – 2012-04-13 22:01:48

相關問題