Как я могу ссылаться на элементы одного объекта, переданного в представление? - PullRequest
0 голосов
/ 17 июня 2010

Я новичок в MVC2 в ASP.NET/C#, поэтому, пожалуйста, прости меня, если я что-то неправильно понял. У меня есть код, подобный этому в моем контроллере:

var singleInstance = new Person("John");
ViewData["myInstance"] = singleInstance;
return View();

Так что, на мой взгляд, Index.aspx, я хочу иметь возможность ссылаться на элементы в этом объекте. Например, Person имеет член с именем Name, который устанавливается в конструкторе. В представлении я хочу получить Person.Name из того, что хранится в объекте ViewData. Ex.:

<%= ViewData["myInstance"].name %>

Это не работает. Единственный реальный обходной путь, который я нашел, - это сделать что-то вроде этого:

<% var thePerson = ViewData["myInstance"];
print (or whatever the method is) thePerson.Name;
%>

Любая помощь будет высоко ценится ... Это было намного проще в PHP / Zend Framework ... sigh

Ответы [ 3 ]

0 голосов
/ 17 июня 2010

Посмотрите этот учебник.

Действительно, вы должны (как упоминает Томми) передать объекты модели в представление, используя возвращаемое представление (foo). Но если вы должны использовать ViewData (иногда вам это нужно), просто приведите ваш объект к исходному типу в вашем View.

т.е.

 <%= (ViewData["myInstance"] as Person).name; %>

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

0 голосов
/ 17 июня 2010

Почему бы вам не создать строго типизированное представление, которое принимает "Персона"?

В вашем контроллере

var singleInstance = new Person("John"); 
ViewData.Model = singleInstance; 
return View(); 

В вашем (строго типизированный) Вид

<%= Html.Encode (Model.name) %>
0 голосов
/ 17 июня 2010

Это должно сработать, но в данном случае было бы проще использовать строго типизированные представления (хорошие преимущества в безопасности и немного проще модифицировать представление с данными модели).Затем вы можете сделать это в вашем контроллере:

var singleInstance = new Person("John");
return View(singleInstance);

и это, по вашему мнению:

<%= html.encode(model.name) %>

В вашем случае я использую объект ViewData в некоторых случаях, и что выдолжен работать.Теперь IntelliSense в Visual Studio не будет автоматически вызывать свойства определенного объекта ViewData, потому что вы можете передавать «что угодно» в ViewData.Если только в C # вам не нужно это.

<%= ViewData["myInstance"].name; %>

Может быть, C # ASP.MVC'er может влиять на это

'что-нибудь' - на случай, если какой-то объектчто вы не можете передать здесь

РЕДАКТИРОВАТЬ: Комментировать для печати или любой другой строки

Вам не нужно вызывать какие-либо методы для распечатки чего-либо, вы просто заключаете переменную /объект в тегах <% =%>.Метод html.Encode () помогает предотвратить атаки XSS и другие неприятные ситуации.

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