2012-08-22 27 views
1

使用ASP.Net MVC 3 - DropDownListFor未能選擇如果HtmlFieldPrefix被設定在局部視圖中的值形成模型

<%= Html.DropDownListFor(model => model.FeeTypeId, Model.GetFeeTypes(), new { })%> 
在這種情況下

右選項被選擇時,根據Model.FeeTypeId當選擇被渲染。

BUT
如果使用的局部視圖,通過它的特定HtmlFieldPrefix呈現形式(你將需要它,如果,例如,要渲染的兩個相同的視圖,並希望不同的ID的元素)

<% Html.RenderPartial("path-to-partial-view", Model, new ViewDataDictionary() { TemplateInfo = new TemplateInfo() { HtmlFieldPrefix = "myPrefix" } }); %> 

那麼該值將不會被選中。

看起來類似於DropDownListFor in EditorTemplate not selecting value的問題,但來自不同的原因。

對着MVC 3源好像問題出在 它採用了htmlHelper.ViewData.Eval(fullName);
從而未能獲得通過的全名時,它所包含的前綴值,
TextBoxFor不會失敗的SelectInternal方法因爲它傳遞的表達InputHelper的值,因此它不會使用ViewData.Eval

只是要確定在局部視圖測試了它:
在局部視圖 下面將打印"myPrefix.FeeTypeId"

<%= Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName("FeeTypeId") %> 

和下面將打印"by property name: [value] by full name: [empty string]"

<%="by property name: " + Html.ViewData.Eval("FeeTypeId")%><br /> 
<%= "by full name: " + Html.ViewData.Eval(Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName("FeeTypeId"))%> 

我發現的唯一的解決方案是在產生Model.GetFeeTypes(列表)和標記我想作爲所選擇的選項:

<%= Html.DropDownListFor(model => model.FeeTypeId, Model.GetFeeTypes(Model.FeeTypeId), new { })%> 

不太喜歡這個解決方案+我知道我可以在部分視圖中創建列表,這也是醜陋的,
是否有另一種解決方案呢?

回答

1

我發現這是MVC中的一個錯誤。它不是固定的,儘管有解決方法。 看到我自己回答的問題(在找到您的文章之前,我遇到了同樣的問題)。

MVC4 binding drop down list in a list (bug)

問候
克雷格

相關問題