【问题标题】:Html.EditFor not finding editor templateHtml.EditorFor 找不到编辑器模板
【发布时间】:2014-10-31 18:12:25
【问题描述】:

请帮忙!这让我发疯了。

我正在尝试重构一些代码,因为在模型、视图和控制器中有一堆剪切和粘贴。

查看模型

namespace Foo.Models.Bar
{
[KnownType(typeof(RecruitEditModel))]
public class RecruitEditModel
{
    //...
    public CommonServicesEditModel Services { get; set; }

Services 是一个属性,它包含模型中的另一个类,我将在其中放置公共代码。

在 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:&nbsp;&nbsp;</div>
        @Html.EditorFor(model => model.TradeGC)
        @Html.ValidationMessageFor(model => model.TradeGC)
    </div>
    @*...*@

我遇到的问题是,显然没有找到编辑器模板,而是生成了默认编辑器。

我在尝试调整 CSS 时发现了这一点。未生成 EditorTemplate 中标题中的“您好”。无论我做什么,除了注释掉 EditFor 调用之外,显示的字段都没有变化。

我正在本地 IIS 上运行调试,并尝试重新启动应用程序池并刷新网站,但没有任何乐趣。

如何让编辑器模板中的更改传播到视图?

【问题讨论】:

  • 您这里确实有些东西搞砸了...您的上下文没有意义... TradeGC 是什么类型?你的帖子说这个模板叫做 TradeEdit.cshtml,是不是被调用了?我在那里看不到 TradeEdit 类型。您的类型与您显示的完全不同...我在这里也看不到任何嵌套类...服务不是嵌套类,它只是一个属性。嵌套类是在其他类中DEFINED 的类...即class foo { class bar { ... } }

标签: asp.net-mvc razor


【解决方案1】:

答案很明显,但并不那么明显。我认为编辑器模板将解析编辑器模板中的模型声明。不,比这更容易。

编辑器模板必须命名为 {type}.cshtml。

另一种可能性是我可以像这样使用 UIHint:

   [UIHint("TradeEdit")]
   public CommonServicesEditModel Services { get; set; }

但我还没有测试过。

感谢Growing With the Web 的回答。

【讨论】:

  • 这是一种二分法……它必须知道类型才能找到类型来解析类型……
【解决方案2】:

在模型 'RecruitEditModel' 中放置带有 'virtual' 关键字的嵌套类,如下所示:

namespace Foo.Models.Bar
{
[KnownType(typeof(RecruitEditModel))]
public class RecruitEditModel
{
  //...
  public virtual CommonServicesEditModel Services { get; set; }

如果你有数据库,你应该在此之后更新它:)

【讨论】:

  • Virtual 与 EditorTemplates 没有任何关系
  • @ErikFunkenbusch 它与数据库模式一起使用,如果它不是虚拟的,它将不会被映射,因此如果您尝试将其发送到 Html 帮助器,它将为空
  • @MartinSolev - 没有迹象表明他甚至在使用数据库模式。事实上,他使用的词“视图模型”通常正好相反。并且仍然与编辑器模板无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多