2015-12-31 2 views
2

Если мы все посмотрим на диаграмму mvc, представление не должно знать модели, которые контроллер выдает (согласно обзору msdn mvc https://msdn.microsoft.com/en-us/library/dd381412(v=vs.108).aspx). Для меня ViewData, ViewBag и TempData нарушают это, и я почесал голову, почему эти три концепции были введены.ViewData, ViewBag и TempData нарушают MVC?

Возможно, я ошибаюсь? Я могу легко передать данные в представление, используя модели вместо этих трех.

Хотелось бы узнать мнение других людей.

Если вы проголосуете, пожалуйста, прокомментируйте почему.

спасибо

ответ

1

можно легко передавать данные с точки зрения использования моделей вместо этих три.

Да, безусловно, вы можете и в таком случае ваш взгляд становится сильно типизированных вид, и вы можете видеть, начиная с вашей точки зрения имеет ряд

@Model entityName 

Что делать, если вы не хотите (по некоторым причинам) ваше мнение строго типизировано. Как вы думаете, в таком случае вы собираетесь передавать данные для просмотра.

Это цель ViewData или ViewBaG или TempData.

вид не должен знать модели контроллер выдает

Я думаю, что вы неправильно истолкованы эту линию, которая не может быть согласована. Если вашему представлению нужны данные для отображения в элементах управления (может быть вид редактирования), то откуда они будут получать данные, если они не знают, откуда их читать.

Вид каким-либо образом должен знать данные модели (либо в форме прямого прохождения объекта модели, либо с использованием любой из этих трех методов).

EDIT:

За ваш последний комментарий:

может я не использовать это?

public class TestModel 
{ 
    public dynamic testproperty { get; set; } 
} 

Да, наверное, можно, но это не правильный путь. Попробуйте создать строго типизированное представление с моделью как TestModel и использовать любой шаблон леса и посмотреть, могут ли строительные леса создавать правильный шаблон.

Это не будет, поскольку строительные леса внутренне используют отражение, чтобы пройти через ваши свойства модели и соответственно создавать элементы управления для этих свойств/членов. Поскольку у вас есть динамическое свойство, оно не сможет отразить это свойство. измените тип на статический тип, например String, и увидите, что он сгенерирует @Html.DisplayFor(modelItem => item.testproperty). Это вопрос.

Даже если вы не используете шаблон для строительных лесов и не создаете элементы управления рукой; какой тип управления вы создадите для своей собственности? так как это tped как dynamic это может быть что угодно (string, int, datetime, email ...).

ViewBag или ViewData - это техника управления состоянием, позволяющая передавать небольшое количество данных в виде представлений или контроллеров для просмотра. Вы всегда должны передавать свои данные как объект модели, чтобы ваше представление было правильно указано @SteveHarris.

Надеюсь, что это дает понять в некотором смысле.

+0

Могу ли я не использовать это? 'public class TestModel { public dynamic testproperty {get; задавать; } } 'что я сделал с нашей, каждый взгляд привязан к модели. Хорошая вещь об этом подходе - если есть изменение имени, представление будет знать об этом. используя ViewBag, ViewData и TempData потребует, чтобы представление узнало имя ключа. –

+0

Вид должен быть в курсе, если модель. Представление построено из данных в модели, представление передает данные в форме модели контроллеру. Контроллер принимает данные и применяет любую бизнес-логику, валидацию и т. Д. –

+0

@ avatart0ph, см. Edit в ответ на разъяснение вашего комментария. – Rahul

Смежные вопросы