Привязка различных типов данных.
При привязке простых типовDefaultModelBinder преобразует строковое выражение параметра из данных запроса к типу параметра с помощью класса System.ComponentModel.TypeDescriptor. Если же значение нельзя преобразовать, то привязка оканчивается неудачей. Поэтому есть смысл использовать параметры, допускающие значение null, а в метод действия вкладывать соответствующую логику по проверке значения:
public ActionResult Edit(int? id) {
// ...}
При получении значений для сложных типов, например, для той же модели Book, DefaultModelBinder с помощью рефлексии просматривает объект и находит все свойства объекта, которые могут использоваться при привязке. Например, DefaultModelBinder видит, что объект Book имеет свойство Author, то привязчик будет искать в запросе параметр "Author".
• Если свойство представляет простой тип, то для него используется, как было указано выше преобразование с помощью класса класса System.ComponentModel.TypeDescriptor.
• Если же свойство представляет сложный тип - то опять повторяется рефлексия и весь цикл.
Передача данных из метода действия контроллера в представление. Примеры.
Существуют различные способы передачи данных из контроллера в представление:
1. Предоставление объекта модели представлению (1).
2. Использование объекта ViewData. ViewData представляет словарь из пар ключ-значение (2)
3. Использование объекта ViewBag. ViewBag- позволяет определить различные свойства и присвоить им любое значение. (3)
4. Использование объекта TempData. TempData - представляет словарь, хранящий пары ключ-значение, как и ViewData, но TempData позволяет сохранять переданное значение в течении всего текущего запроса. Использование TempData аналогично работе с ViewData.
|
|
(1) Отправить объект представлению можно, передав его в качестве параметра методу View(), как показано в примере ниже:
namespace ControllersAndActions.Controllers
{
public class ExampleController : Controller
{
public ViewResult Index()
{
DateTime date = DateTime.Now;
returnView(date);
}
}
}
Объект DateTime передается как модель представления, а доступ к нему в представлении осуществляется с помощью ключевого слова Model синтаксиса Razor
@model DateTime
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
День недели: @Model.DayOfWeek
(2) ViewData представляет словарь из пар ключ-значение:
public ViewResult SomeMethod()
{
ViewData["Head"] = "Приветмир!";
returnView("SomeView");
}
В этом случае в представлении SomeView.cshtml можно получить передаваемую строку следующим образом:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>SomeView</title>
</head>
<body>
<div>
<h2>@ViewData["Head"]</h2>
</div>
</body>
</html>
(3)Объект ViewBag позволяет определять произвольные свойства в динамическом объекте C# и обращаться к ним в представлении. Динамический объект доступен через свойство Controller.ViewBag, как показано в примере ниже:
|
|
namespace ControllersAndActions.Controllers
{
public class ExampleController : Controller
{
public ViewResult Index()
{
ViewBag.Message = "Привет";
ViewBag.Date = DateTime.Now;
returnView();
}
}
}
В примере свойства Message и Date объекта ViewBag определяются простым присваиванием им значений. До этого момента указанные свойства не существовали, и никакой подготовительной работы для их создания не проводилось. Для чтения данных в представлении применяются те же самые свойства, которые устанавливались в методе действия:
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
День недели: @(ViewBag.Date.DayOfWeek)<br />
Сообщение из контроллера: @ViewBag.Message
Хотя ViewData и ViewBag и похожи, в то же время они не полностью эквивалентны.
§ Так, например, нельзя передавать динамические значения из ViewBag в методы расширения в представлениях.
§ Например, мы не можем написать @Html.TextBox("name", ViewBag.Name), так как компилятор C# должен знать тип каждого параметра во время компиляции, чтобы выбрать нужный метод расширения.
§ В этом случае нам надо либо использовать ViewData: @Html.TextBox("name", ViewData["Name"]), либо применить приведение типов: @Html.TextBox("name", (string)ViewBag.Name)
Дата добавления: 2018-05-02; просмотров: 235; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!