如果TypeConverter存在,则显示未调用的模板

时间:2016-11-03 20:46:10

标签: asp.net-mvc asp.net-mvc-5 html-helper

只要为复杂类型注册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?,然而,标记为答案的“解决方案”并不是真正的解决方案。它只是解决问题...

0 个答案:

没有答案