只要为复杂类型注册TypeConverter,它就无法为派生类型的属性加载正确的(基本类型)显示模板,即@Html.DisplayFor(m => m.My_Derived_ComplexTypeProp)
无法加载MyComplexType
显示模板。
我稍微调试了显示模板选择逻辑,问题似乎非常明显:
// From TemplateHelpers:
internal static IEnumerable<string> GetViewNames(ModelMetadata metadata, params string[] templateHints)
{
[...]
yield return fieldType.Name; // TRY 1: Type, but no base type walking
if (!(fieldType == typeof (string))) // YEP ...
{
if (!metadata.IsComplexType) // Unfortunately YEP (see below...)
{
if (fieldType.IsEnum) // NOPE
yield return "Enum";
else if (fieldType == typeof (DateTimeOffset)) // NOPE
yield return "DateTime";
yield return "String"; // TRY 2: string => uh oh, string will be found, and we do not use the correct display template.
}
[...]
else
{
[...] // only in here we would have the base type walk
}
[...]
// From ModelMetadata:
public virtual bool IsComplexType
{
get
{
// !!! !!! WTF !!! !!!:
// Why is IsComplexType returning false if we cannot convert from string?
return !TypeDescriptor.GetConverter(this.ModelType).CanConvertFrom(typeof (string));
}
}
一旦逻辑检测到“没有复杂类型”,它只会检查枚举,DateTimes并返回string
的模板,否则!但请看IsComplexType
- &gt;的实施情况如果可转换为string
,则将其视为简单类型!
因此,当然,只要为复杂类型注册类型转换器,显示模板解析就无法使用正确的模板。
是否有已知的解决方法?我无法相信,我是为数不多的人之一直到现在......
我找到了Cannot use TypeConverter and custom display/editor template together?,然而,标记为答案的“解决方案”并不是真正的解决方案。它只是解决问题...