ASP.NET MVC 3 не распознает.вид cshtml-файлы
я портировал приложение mvc 3 от vs 2010 до vs2012.
портированное приложение использует .NET 4.
все старые биты работают, но с новым представлением, созданным в vs 2012, механизм представления не ищет .cshtml-файлы для просмотра.
например, когда пользователь запрашивает действие индекса на контроллере в зоне адвокаты, адрес:
mysite.com/solicitors/welcome/gg
(где gg-имя пользователя). В этом случае возвращается ошибка есть:
представление "индекс" или его мастер не найден или нет механизма просмотра поддерживает поиск местоположения. В следующих местах: поиск: ~ / области / адвокаты / просмотры / Добро пожаловать / индекс.аспн ~ / Области / Адвокаты / Просмотры / Добро Пожаловать / Индекс.ascx и ~ / Области / Адвокаты / Просмотры / Общий / Индекс.аспн ~ / Области / Адвокаты / Просмотры / Общий / Индекс.ascx ~ / Views / Добро пожаловать / индекс.аспн ~ / Views / Добро Пожаловать / Индекс.ascx ~ / Views / Shared / Index.аспн ~ / Views / Shared / Index.ascx и ~ / Области / адвокаты / взгляды / Добро пожаловать/gg.мастер ~ / Области / адвокаты / мнения / общий/gg.master ~ / Views / Добро пожаловать/gg.мастер ~ / Просмотры / общий/gg.master ~ / области / адвокаты / просмотры / Добро пожаловать/gg.cshtml по ~ / Области / адвокаты / взгляды / Добро пожаловать/gg.vbhtml по ~ / Области / адвокаты / мнения / общий/gg.cshtml по ~ / Области / адвокаты / мнения / общий/gg.vbhtml ~ / просмотры / Добро пожаловать/gg.cshtml по ~ / Views / Добро пожаловать / gg.vbhtml ~ / просмотры / общий доступ/gg.cshtml по ~ / Просмотры / общий/gg.vbhtml по
Я уже добавил следующий раздел параметр appsettings в web.config, но это не имеет значения.
<add key="webpages:Version" value="1.0" />
EDIT:
маршрут в SolictorAreaRegistration.cs:
context.MapRoute(
"Solicitors_Welcome",
"Solicitors/Welcome/{nameUser}",
new { controller = "Welcome", action = "Index", nameUser = UrlParameter.Optional }
);
EDIT 2:
используя RouteDebug, я вижу, что правильный контроллер и действие найдены.
Маршрута
Значение Ключа
nameUser: gg
контроллер: Добро пожаловать
действие: индекс
Маркеры Данных
ключ Значение
Пространства Имен: System.String[]
площадь: адвокаты
UseNamespaceFallback: False
EDIT 3:
маршрут найден правильно, как я вижу из отладки: действие индекса поражено.
проблема возникает, когда вызов строки вид вызывается:
namespace MyApp.Areas.Solicitors.Controllers
{
[Authorize]
public partial class WelcomeController : Controller
{
//
// GET: /Solicitors/Welcome/
public virtual ActionResult Index(string nameUser)
{
return View("Index", nameUser);
}
}
}
2 ответов
хорошо, добрался до сути:
Проблема:
проблема в том, что модель моего представления имеет тип string. В моем действии я передавал строку в качестве параметра модели:
public virtual ActionResult Index(string nameUser)
{
return View("Index", nameUser);
}
это столкнется с одной из перегрузок контроллера.Вид.(..):
View(string, string)
второй параметр ожидает имя файла макета. Когда вы это делаете, MVC отправляется на поиски файла макета с именем значения вашей строки, которое может быть, например:
"Привет, Мир. Я идиот, но если вы дадите мне приличное сообщение об ошибке, я, возможно, смогу исправить ошибку."
очевидно, что файл макета с этим именем не существует. Также нет файла макета под названием " gg " (имя пользователя моего (тестового) адвоката).
Решение:
решение простое:
укажите, что вторым параметром является модель, а не макет.
public virtual ActionResult Index(string nameUser)
{
return View("Index", model: nameUser);
}
полезное Статья:
чтобы просмотреть расширенное обсуждение этого вопроса, см. следующую статью:
MVC Gotcha: остерегайтесь при использовании модели вашего представления-это строка
большое спасибо heartysoft.com для просветления.
Это смотря как вы можете видеть из сообщения об ошибке:
~/Areas/Solicitors/Views/Welcome/gg.cshtml
Если вам нужно искать представление индекса, вам нужно указать его:
http://mysite.com/solicitors/welcome/index/gg