Привязка различных типов данных.



При привязке простых типов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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!