2013-09-27 21 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上的基类字段中插入额外的字段。也许这表明我的班级设计是不正确的。 –