У меня есть следующее:
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.