2010-03-22 81 views
1

如果你看一下創建和編輯的晚餐,然後的的NerdDinner比如你看到他們使用的部分(ViewUserControl或ASCX)DinnerForm把創建和編輯的功能晚餐納入一個文件,因爲它是必不可少的,他們使用它使用RenderPartial(「DinnerForm」)。編輯,然後在ASP.NET MVC創建使用視圖EditCreate.ascx部分

這種做法似乎對我很好,但我碰到的,你必須要產生額外的路由值或HTML屬性添加到表單標籤的問題。

此自動拾取當前動作和控制器:

<% using (Html.BeginForm()) { %> 

然而,如果使用另一種BeginForm()過載,其允許在加密類型或任何其他屬性傳遞我必須做這樣的:

<% using ("Create", "Section", new { modal = true }, FormMethod.Post, new { enctype = "multipart/form-data" })) 

正如您所看到的,我們失去了自動檢測我們調用RenderPartial(「OurCreateEditFormPartial」)的視圖的能力。我們無法在其中編寫硬編碼值,因爲在編輯視圖中,此回發將失敗或不會回發到正確的控制器操作。

在這種情況下該怎麼辦?

回答

3

怎麼樣加入以下HTML助手:

public static MvcHtmlString CurrentAction(this HtmlHelper htmlHelper) 
    { 
     return htmlHelper.ViewContext.RouteData.Values["action"]; 
    } 

    public static MvcHtmlString CurrentController(this HtmlHelper htmlHelper) 
    { 
     return htmlHelper.ViewContext.RouteData.Values["controller"]; 
    } 

然後你可以去這樣的事情:

<% using (Html.CurrentAction, Html.CurrentController, new { modal = true }, FormMethod.Post, new { enctype = "multipart/form-data" })) 

它不是100%完美的,但你也可以添加額外的HTML幫助這將簡化它多一點:

public static MvcForm BeginForm(this HtmlHelper htmlHelper, object routeValues, FormMethod method, object htmlAttributes) 
{ 
    return htmlHelper.BeginForm(Html.CurrentAction, Html.CurrentController, routeValues, method, htmlAttributes); 
} 

讓我知道這是否有幫助。 乾杯

+0

這絕對不會幫助,但它看起來有點誇張。問題是,每隔一天我碰上,我必須寫一些自定義的助手或擴展,以實現它應當已經在那裏,但顯然ASP.NET MVC設計錯過了它的一些基本功能的另一個特殊情況。我想知道這會繼續發生在我身上多久。 ;)MVC的「助手」你看到周圍的網或浮動的 – mare 2010-03-22 01:33:05

+0

90%,因此僅僅是語義糖,只有縮短冗長的否則調用。 MVC團隊在這裏「錯過」了什麼。大多數情況下,你需要的是在你面前,只需要知道在哪裏看。 – jfar 2010-03-22 02:22:57

+0

我同意jfar ... 90%的時間它做我希望做的事情,但我喜歡這樣一個事實,即我可以無縫地添加我不需要的功能,以防止它在上面,以防萬一。 – anthonyv 2010-03-22 02:51:30

0

我回答在一個古老的線程,因爲它來了兩個數量上的谷歌搜索,而我一直在尋找同樣的事情:)找到這個SO職位:

Html.BeginForm and adding properties

隨着MVC3(不確定MVC2)你可以傳入null作爲動作和控制器,並獲得BeginForm()使用的默認路由。

@Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data"}) 

乾杯!

相關問題