Модель ASP.net MVC View против ViewData.Model? - PullRequest
6 голосов
/ 29 марта 2012

Я изучаю asp.net mvc и обнаружил кое-что интересное:

Кажется, что я не могу явно определить Model View в View с сообщением об ошибке, в котором говорится, что у него нет сеттера.

@{ this.Model = "Hello" } //error

Затем я посмотрел на исходный код в WebViewPage.cs, и свойство модели представления фактически выглядит так:

public object Model { get { return ViewData.Model; } }

Таким образом, ошибка.

Но интересно, как я могу это сделать: @{ ViewData.Model = "hello"; } и действительно иметь возможность использовать оператор @model, в результате чего "привет"

Я думаю, что я 'я слишком много в этом разбираюсь, но почему это так?

новичок в C # и ASP.NET

Ответы [ 4 ]

8 голосов
/ 29 марта 2012

Правило: разделение интересов ... В MVC контроллер предоставляет модель для представления, и он всегда будет тем контроллером, который может устанавливать / назначать модель для представления .... которое могут использовать представления.... это по замыслу ... игра по правилам - это то, что я бы сказал ... и если вы изучаете MVC, это здорово, и я настоятельно рекомендую вам прочитать

книгу Стивенса Сандерсона MVC

2 голосов
/ 29 марта 2012

Это «яма успеха», теория проектирования API. Вы не должны изменять свойство Model в своем представлении, поэтому они затрудняют это. Но поскольку могут быть случаи, когда у вас нет выбора, они не делают это невозможным.

2 голосов
/ 29 марта 2012

Такие вещи, как ModelBinder и то, что иногда не нужно, чтобы изменить модель в контексте, поэтому им нужен установщик. Другая причина - облегчить юнит-тестирование.

Однако вам редко придется делать это самостоятельно, поэтому злоупотребляйте этим на свой страх и риск.

1 голос
/ 29 марта 2012

Здесь нет магии. В первом случае (как вы указали) для свойства Model нет установщика свойств. Таким образом, вы не можете ничего назначить. И это имеет смысл - зачем вам переназначать модель из вида?

Во втором случае вы взломаете / обойдете это ограничение, используя ViewData.Model напрямую. Так как это тип объекта, вы можете назначить что угодно.

(Кстати, я предполагаю, что в первом фрагменте кода вы назначаете «Hello», а не «Hello»)

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