Asp.net mvc 如果存在TypeConverter,则不调用显示模板

Asp.net mvc 如果存在TypeConverter,则不调用显示模板,asp.net-mvc,asp.net-mvc-5,html-helper,Asp.net Mvc,Asp.net Mvc 5,Html Helper,一旦我为复杂类型注册了TypeConverter,它就无法为派生类型的属性加载正确的(基本类型)显示模板,即@Html.DisplayFor(m=>m.My\u-derived\u-ComplexTypeProp)无法加载MyComplexType显示模板 我已经调试了一点显示模板选择逻辑,问题似乎非常明显: // From TemplateHelpers: internal static IEnumerable<string> GetViewNames(ModelMetadata

一旦我为复杂类型注册了TypeConverter,它就无法为派生类型的属性加载正确的(基本类型)显示模板,即
@Html.DisplayFor(m=>m.My\u-derived\u-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));
  }
}
//来自TemplateHelpers:
内部静态IEnumerable GetViewNames(ModelMetadata元数据,参数字符串[]TemplateHits)
{
[...]
yield return fieldType.Name;//尝试1:Type,但不使用基类型
如果(!(fieldType==typeof(string))//是。。。
{
如果(!metadata.IsComplexType)//很遗憾,是的(请参见下文…)
{
if(fieldType.IsEnum)//否
产生返回“枚举”;
else if(fieldType==typeof(DateTimeOffset))//否
返回“日期时间”;
yield return“String”;//TRY 2:String=>uh-oh,将找到字符串,并且我们没有使用正确的显示模板。
}
[...]
其他的
{
[…]//只有在这里,我们才有基本类型的walk
}
[...]
//从ModelMetadata:
公共虚拟bool IsComplexType
{
得到
{
//!!!!!!WTF!!!!:
//如果无法从字符串转换,为什么IsComplexType返回false?
return!TypeDescriptor.GetConverter(this.ModelType).CanConvertFrom(typeof(string));
}
}
当逻辑检测到“无复杂类型”时,它只需检查枚举、日期时间,并返回
string
的模板,否则!但看看
IsComplexType
->的实现,如果可转换为
string
,它将被视为简单类型

因此,当然,一旦为复杂类型注册了类型转换器,显示模板解析就无法使用正确的模板

有一个已知的解决方法吗?我不敢相信,我是迄今为止为数不多的遇到这个问题的人之一


然而,我发现,标记为答案的“解决方案”并不是真正的解决方案。它只是解决了问题…

如果有人感兴趣,我在创建报告如果有人感兴趣,我在创建报告