ASP.NET MVC 3 - Portable Area View не находит мою модель - PullRequest
1 голос
/ 03 августа 2011

Я начал использовать Переносимые Области MvcContrib, и все работает отлично для очень простых представлений, но когда я хочу использовать пользовательскую модель в моем представлении, я получаю сообщение об ошибке, говоря, что пространство имен не существует.

Представление установлено, чтобы быть встроенным в качестве ресурса.И Intellisense в представлении распознает модель просто отлично.

Кто-нибудь есть какие-либо идеи, что может вызвать проблему?

ОБНОВЛЕНИЕ

Я думаю, это может быть связано с тем, что я использую MEF для загрузки плагинов.У меня была похожая проблема при загрузке контроллеров.Мне пришлось создать собственную ControllerFactory, которая бы выглядела в списке контроллеров MEF, если фабрика по умолчанию не нашла подходящий контроллер.

UPDATE 2

Мне удалось избавиться от ошибки, предоставив RazorBuildProvider с моими MEF-загруженными сборками.Однако теперь вид уже не найден.Если представление не является строго типизированным, оно найдено.

    RazorBuildProvider.CodeGenerationStarted += (object sender, EventArgs e) =>
    {
        RazorBuildProvider provider = (RazorBuildProvider)sender;
        foreach (var module in ExternalComponents)
        {
            provider.AssemblyBuilder.AddAssemblyReference(module.GetType().Assembly);
        }
    };

Исходный код

Модель

namespace Isis.Plugins.TextArea.TextArea.Models
{
    public class TextAreaModel
    {
        [Required(ErrorMessage = "Field is required")]
        public string Message { get; set; }
    }
}

Контроллер:

namespace Isis.Plugins.TextArea.TextArea.Controllers
{
    [Export(typeof(IController))]
    public class IndexController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            return View(new TextAreaModel() { Message = "Hallow!" });
        }

        [HttpGet]
        public ActionResult Editor()
        {
            return View(new TextAreaModel() { Message = "EDITOR CONTENT" });
        }
    }
}

Вид

@model Isis.Plugins.TextArea.TextArea.Models.TextAreaModel

@Model.Message

Ошибка:

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: CS0234: The type or namespace name 'Plugins' does not exist in the namespace 'Isis' (are you missing an assembly reference?)

Source Error:


Line 27:     
Line 28:     
Line 29:     public class _Page_Areas_TextArea_Views_Index_Index_cshtml : System.Web.Mvc.WebViewPage<Isis.Plugins.TextArea.TextArea.Models.TextAreaModel> {
Line 30:         
Line 31: #line hidden

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Я сталкиваюсь с подобной проблемой с MEF и механизмом просмотра бритвы (пробуя аналогичный подход, который вы описали). Когда я загружаю свои строго типизированные виды бритвы, я получаю сообщение об ошибке «Вы пропустили сборку / ссылку».

Я пытался развернуть свои сборки под Bin, но это тоже не помогло.

Единственный способ избежать этого - выполнить сборку loadFrom на RazorBuildProvider.

Не удалось найти никакой документации на RazorBuildProvider, кроме ", не предназначенной для использования непосредственно из вашего кода "

Ваш фрагмент кода довольно интересный ... не могли бы вы объяснить, как он работает? Где это должно быть зарегистрировано - на AppStart?

    RazorBuildProvider.CodeGenerationStarted += (object sender, EventArgs e) =>
{
    RazorBuildProvider provider = (RazorBuildProvider)sender;
    foreach (var module in ExternalComponents)
    {
        provider.AssemblyBuilder.AddAssemblyReference(module.GetType().Assembly);
    }
};

Любая ясность будет высоко ценится ...

0 голосов
/ 03 августа 2011

В конце концов я решил поместить все плагины в каталог Bin вместо пользовательского каталога плагинов.Это не то решение, к которому я стремился, но пока оно работает.

...