请帮忙!这简直把我逼疯了。
我试图重构一些代码,因为在模型、视图和控制器中有一堆剪切和粘贴。
查看模型
namespace Foo.Models.Bar
{
[KnownType(typeof(RecruitEditModel))]
public class RecruitEditModel
{
//...
public CommonServicesEditModel Services { get; set; }
服务是一个属性,它包含模型中的另一个类,我将在其中放置公共代码。
在Foo\Views中查看
@model RecruitEditModel
@* ... *@
@using (Html.BeginForm("RecruitEdit", "AppMgmt", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@* ... *@
@*@Html.Partial("TradeEdit", Model.Services) <<< DOESN'T BIND *@
@Html.EditorFor(m => m.Services) @* BINDS *@
<input type="submit" value="Save" />
}
在嵌套类上使用分部不会起作用,因为嵌套类不会绑定。(http://lostechies.com/jimmybogard/2011/09/07/building-forms-for-deep-view-model-graphs-in-asp-net-mvc/)
所以我必须使用编辑器模板。
Foo\Views\Shared\EditorTemplates\TradeEdit.cshtml中的编辑器模板
@model Services.CommonServicesEditModel
<div class="left">
<h3>Howdy</h3>
<div class="left theTrade">General Contracting: </div>
@Html.EditorFor(model => model.TradeGC)
@Html.ValidationMessageFor(model => model.TradeGC)
</div>
@*...*@
我遇到的问题是,显然没有找到编辑器模板,而是生成了一个默认编辑器。
我在尝试调整CSS时发现了这一点。EditorTemplate中标头中的"你好"未生成。无论我做什么,除了注释掉EditFor调用之外,显示的字段都没有变化。
我正在本地IIS上运行调试,并尝试重新启动应用程序池和刷新网站,但没有什么乐趣。
如何将编辑器模板中的更改传播到视图?
答案是显而易见的,但并不那么明显。我认为编辑器模板会解析编辑器模板中的模型声明。不,比这更容易。
编辑器模板必须命名为{type}.cshtml.
另一种可能性是,我本可以使用这样的UIHint:
[UIHint("TradeEdit")]
public CommonServicesEditModel Services { get; set; }
但我还没有测试过。
感谢"与网络一起成长"的回答。
在模型"RecruitEditModel"中放入带有"virtual"关键字的嵌套类,如下所示:
namespace Foo.Models.Bar
{
[KnownType(typeof(RecruitEditModel))]
public class RecruitEditModel
{
//...
public virtual CommonServicesEditModel Services { get; set; }
如果你有数据库,你应该在这之后更新它:)