当我调用EditorForModel时,为什么忽略了我的编辑器模板?

时间:2011-07-21 21:04:37

标签: c# asp.net-mvc-3 razor

我有一个名为LocalizedString的类,它在我的asp.net mvc 3项目中引用的外部库中定义。

我在LocalizedString.cshtml文件夹中创建了一个名为~\View\Shared\EditorTemplates的编辑器模板。

我有以下型号

public class Region
{
    public LocalizedString Title { get; set; }
}

我有以下测试页:

@model Region

@Html.EditorForModel()
@Html.EditorFor(x => x.Title)

我调用LocalizedString时未调用EditorForModel的编辑器模板,但是当我明确调用EditorFor(x => x.Title)时它会进行渲染,因此我知道我没有引用问题。< / p>

当我调用EditorForModel(或其等效的EditorFor(x => x))时,为什么我的编辑器模板被忽略

更新

我创建了一个新项目来重现这种行为。我刚刚使用了默认的ASP.NET MVC 3 Internet Application。

Index.cshtml

@model MvcApplication1.Models.Region
@{
    ViewBag.Title = "Home Page";
}

<h2>@ViewBag.Message</h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>

@Html.EditorForModel()

HomeController.cs

using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            return View(new Region());
        }
    }
}

Region.cs

namespace MvcApplication1.Models
{
    public class Region
    {
        public Region()
        {
            this.Name = "RegionInstance";
            this.Title = new LocalizedString();
        }

        public string Name { get; set; }

        public LocalizedString Title { get; set; }
    }
}

LocalizedString.cs

namespace MvcApplication1.Models
{
    public class LocalizedString
    {
        public LocalizedString()
        {
            this.Name = "LocalizedStringInstance";
        }

        public string Name { get; set; }
    }
}

如果运行此程序,输出将仅显示该区域名称的文本输入。 LocalizedString.cshtml 内容永远不会输出。

我还尝试在UIHint属性上使用Region.Title,但仍然无法显示。

2 个答案:

答案 0 :(得分:5)

证明这与Html.EditorForModel doesnt render complex types

的问题相同

默认情况下,ASP.NET MVC不会渲染子复杂类型,因为我通过反射

找到了它
private static bool ShouldShow(ModelMetadata metadata, TemplateInfo templateInfo)
{
  if (metadata.ShowForEdit && metadata.ModelType != typeof (EntityState) && !metadata.IsComplexType)
    return !templateInfo.Visited(metadata);
  else
    return false;
}

ObjectTemplate中的System.Web.Mvc.Html.DefaultEditorTemplates调用。

在检查IsComplexType的行为后,我发现如果一个类型无法通过TypeConverter转换为字符串,则该类型很复杂。如果我为我的子模型创建一个TypeConverter,它会渲染。虽然这个解决方案并不理想,但我可能会坚持EditorFor而不是EditorForModel

using System;
using System.ComponentModel;

public class LocalizedStringTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
        {
            return true;
        }

        return base.CanConvertFrom(context, sourceType);
    }
}

答案 1 :(得分:1)

我们遇到了类似的问题。一切都在开发环境中运行良好,但是当构建安装到测试环境中时,其中一个模板被忽略。事实证明,出于某种原因,在特定模板的属性中,“构建动作”是“无”而不是“内容”。没有想法为什么会这样,但修复该设置可以解决问题。