Почему мой шаблон редактора игнорируется, когда я вызываю EditorForModel? - PullRequest
2 голосов
/ 22 июля 2011

У меня есть класс с именем 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), поэтому я знаю, что у меня нет проблем с рефералом.

Почему мой шаблон редактора игнорируется, когда я вызываю EditorForModel (или его эквивалент EditorFor(x => x))

Обновления

Я создал новый проект для воспроизведения этого поведения. Я просто использовал интернет-приложение ASP.NET MVC 3 по умолчанию.

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 ]

5 голосов
/ 25 июля 2011

Оказывается, что это та же проблема, что и Html.EditorForModel не отображает сложные типы

По умолчанию 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 голос
/ 20 июня 2013

Мы просто столкнулись с подобной проблемой.В среде разработки все работало нормально, но когда сборка была установлена ​​в тестовой среде, один из шаблонов был проигнорирован.Оказалось, что по каким-то причинам в свойствах этого конкретного шаблона «Build action» было «none» вместо «content».Не знаю, почему это так, но исправление этого параметра устранило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...