2013-09-27 41 views
0
class A {} 
class B : A {} 

我已經得到了它被使用像這樣的A模板...使用EditorFor爲派生類型模型的輸出字段

EditorFor(m => m.MyA) 

A也可以是B左右的時間內我A的模板如果要綁定的項目是B,我想輸出額外的B字段。

所以在我的A模板:

@{ 
    Html.EditorFor(i => i as B); 
} 

給...

模板只能與現場訪問,訪問屬性可以使用, 一維數組索引,或者單參數自定義索引器 表達式。

我嘗試使用以下輸出字段,除了表單元素名稱沒有父元素的前綴。

@{ 
    Html.RenderPartial("~/Views/B.cshtml", Model as B, new ViewDataDictionary()); 
} 
+0

如果你喜歡寫東西@ {VAR B =型號爲B,會發生什麼; @ Html.EditorFor(i => b); }? – blueling

+0

我做了一個快速測試。沒有錯誤,但沒有輸出。如果您看到我的答案,我就可以使用RenderPartial並手動添加缺少的前綴數據。 –

回答

1

這工作...

@Html.Partial("~/Views/B.cshtml", Model as B, new ViewDataDictionary(ViewData) 
{ 
    Model = Model as B 
}); 
+0

這實際上也適用:'@ Html.Partial(「B」,Model)'。我無法弄清楚爲什麼'EditorForModel(「B」)'不起作用。 – Shimmy

2

還有,如果你仍然想這樣做編輯模板路線另一種解決方案。您可以爲每種類型創建模板,僅顯示該類型的字段。然後創建一個助手,該助手調用EditorFor,向其傳遞基類型名稱的模板名稱,並將其添加到針對此類型的EditorFor調用中。

型號:

public class ModelA 
{ 
    public string PropA { get; set; } 
} 

public class ModelB : ModelA 
{ 
    public string PropB { get; set; } 
} 

模板MODELA

@model MvcTest.Models.ModelA 
@Html.EditorFor(m => m.PropA) 

模板ModelB

@model MvcTest.Models.ModelB 
@Html.EditorFor(m => m.PropB) 

助手:

public static MvcHtmlString EditorForDerived<TModel, TValue>(this HtmlHelper<TModel> helper 
    , Expression<Func<TModel, TValue>> expression) 
{ 
    var baseHtml = helper.EditorFor(expression, helper.ViewData.Model.GetType().BaseType.Name); 
    var derivedHtml = helper.EditorFor(expression); 
    return new MvcHtmlString(baseHtml.ToHtmlString() + derivedHtml.ToHtmlString()); 
} 

查看:

@model MvcTest.Models.ModelB 
@Html.EditorForDerived(m => m) 

產生這樣的輸出:

<input class="text-box single-line" id="PropA" name="PropA" type="text" value="valA" /> 
<input class="text-box single-line" id="PropB" name="PropB" type="text" value="valB" /> 
+0

啊哈...這個問題是我需要在UI上的基類字段中插入額外的字段。也許這表明我的班級設計是不正確的。 –