Имя «модель» не существует в текущем контексте при ссылке на частичное представление в папке / bin - PullRequest
0 голосов
/ 29 января 2019

У меня есть следующее:

Html.RenderPartial("~/bin/Views/SharedViews/_PartialView.cshtml", model.SharedViewModel);

Это частичное представление исходит из другого проекта, который я установил в качестве ссылки;для этого частичного представления задано Копировать в выходной каталог, потому что MVC не позволяет ссылаться на частичные представления вне вашего веб-проекта.Я использую повторно используемый компонент MVC, поэтому копирую это представление из одного проекта в каталог bin основного проекта:

Project.Common
> Helpers
>> _PartialView.cshtml (Copy to Output Directory = true)

Project.FirstProject
> References
>> Project.Common
> bin
>> (copied) _PartialView.cshtml

Я вижу файл в папке bin;механизм рендеринга MVC также находит его.Я подтвердил это, изменив путь и обнаружив ошибку, связанную с тем, что представление не найдено.Итак - MVC находит представление, но выдает эту ошибку:

_PartialView.cshtml (1): ошибка CS0103: имя 'модель' не существует в текущем контексте '

Содержимое _PartialView.cshtml:

@model Common.ViewModel

@if (Model.Check)
{
    <p>success!</p>
}

Если я изменю содержимое так, чтобы оно было просто HTML:

<p>test</p>

Я получаю ту же ошибку.Если я затем изменю вызов, чтобы использовать Html.Partial вместо RenderPartial, я получу ту же ошибку.

Что здесь происходит?

Если я затем удалю модель представления из вызова,Я получаю:

Представление в '~ / bin / Views / _PartialView.cshtml' должно происходить из WebViewPage или WebViewPage. '

С обоими RenderPartial иPartial.

Добавление @inherits System.Web.Mvc.WebViewPage в начало частичного представления приводит к отображению html, но не исправляет ошибку cshtml The name model does not exist.

Обновление модуля представления для включенияпапка bin и ссылка на представление без указания полного пути не работает - механизм просмотра не может найти представление даже после выполнения следующих действий:

public class CommonAccessibleViewEngine : RazorViewEngine
{
    public CommonAccessibleViewEngine()
    {
        // added to leverage reusable pagination component (and other reusable view components)
        // MVC by default doesn't allow you to reference Views outside of your immediate project.  By setting views to copy to output directory and then modifying the engine as follows, 
        // we're telling the view engine to expand its scope to include these referenced views in addition to its default scope.
        var newFormats = new string[2] { "~/bin/Views/YourFolder/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
        this.PartialViewLocationFormats = newFormats;
        this.ViewLocationFormats = newFormats;
    }
}

При этом в Application_Start:

ViewEngines.Engines.Add(new CommonAccessibleViewEngine());

Связывание вида также не работает:

Связанное частичное представление не найдено MVC

Обходной путь:

  • Убедитесь, что частичное представление включает @inherits System.Web.Mvc.WebViewPage - это позволяет ссылаться на ViewBag.Model по-прежнему недоступен.
  • Используйте специальный механизм просмотра (как указано выше), чтобы указать местоположение файла (bin для меня)
  • Назначьте любую модель, которую ожидает ваш частичный видв качестве свойства ViewBag: ViewBag.PartialViewModel = partialViewModel;
  • Приведение ViewBag в частичном представлении:
@{
    var Model = (Common.ViewModel)ViewBag.PartialViewModel;
}
  • Пропустите тот факт, что Microsoft делаетключевой принцип качественного программирования - возможность многократного использования - такой кошмар, который нужно выяснить в MVC.

1 Ответ

0 голосов
/ 29 января 2019

Я думаю, это потому, что вы копируете CSHTML в выходной каталог;если вы отключите функцию «Копировать в выходной каталог», путь к вашему частичному представлению может выглядеть следующим образом:

~/Views/Shared/_PartialView.cshtml

Или каким бы ни был фактический путь.

Для Html.Partial("View") представление необходимонаходиться либо в общей папке, либо в папке исполняющего контроллера, чтобы механизм просмотра мог ее найти.Вы можете просто определить имя представления без расширения файла.

EDIT Вы также можете связать элемент с веб-проектом в указанном каталоге, используя опцию Добавить как ссылку: https://blogs.msdn.microsoft.com/zainnab/2010/11/12/linked-items-in-projects/

...