Файл макета ничего не знает о представлениях (файлы .cs html), которые его используют, и представления также ничего не знают о файле макета, кроме его имени.
Правильный способ подключения два выглядит следующим образом:
(1) Имеют _Layout.cs html, содержащие оператор @RenderBody()
. Именно здесь будут отображаться выходные данные, сгенерированные представлениями.
(2) Пусть ваш файл View ссылается на файл макета по его имени, также желательно, чтобы он использовал Model
класс и сделать его частичным HTML:
// file Views/Location/MyLocation.cshtml
@model YourProject.Models.Location // See part (3) below
@{
Layout = "_Layout";
}
<h2>My Location</h2>
<div>
City: @(Model.City)
</div>
(3) Определить класс модели:
// file Models/Location.cs
namespace YourProject.Models
{
public class Location
{
public string City { get; set; }
}
}
(4) Сделайте так, чтобы Action-метод в Controller создал объект Model и отправил его в представление:
// file Controllers/LocationController.cs
namespace YourProject.Controllers
{
public class LocationController : Controller
{
public IActionResult MyLocation()
{
var model = new Location { City = "NYC" };
return View(model); // This will start MyLocation.cshtml and pass 'model' as a parameter into it
}
}
}
Подробнее здесь:
В качестве альтернативы вы можете использовать ViewBag
. Затем вы можете опустить класс Location
Model, но вы также потеряете все преимущества Intellisense и проверки правильности во время компиляции.
// file Views/Location/MyLocation.cshtml
@{
Layout = "_Layout";
}
Location: @(ViewBag.Location) <i>(from ViewBag)</i>
// file Controllers/LocationController.cs
namespace YourProject.Controllers
{
public class LocationController : Controller
{
public IActionResult MyLocation()
{
ViewBag.Location = "NYC";
return View(); // This will start MyLocation.cshtml without a 'model'.
}
}
}
Вы можете использовать подход ViewBag, подход Model. или даже объединить их.
Вы также можете использовать ViewBag в файле _Layout, но тогда вам нужно убедиться, что каждый метод действия Controller предоставляет значение в ViewBag
, поскольку оно не сохраняется между вызовами.