Передача ViewData в ViewPage в ASP.NET MVC - PullRequest
1 голос
/ 21 февраля 2009

Я пытаюсь создать пользовательский элемент управления в ASP.NET MVC. То, чего я хочу избежать, - это смешивать представление (html) и код (C #) в этих элементах управления.

После нескольких часов поисков в Google и борьбы с этой проблемой я наконец-то подумал о создании вспомогательных методов, использующих представление ASP. Механизм считал класс ViewPage.

Я могу создать экземпляр класса и даже загрузить шаблон ascx, используя методы LoadControl и LoadTemplate, но проблема в том, что когда я передаю объект ViewData экземпляру класса ViewPage, я не вижу ViewData в ViewPage и я получаю эту ошибку:

ViewUserControl '~ / Components / Controls / EditableLabel / Views / EditableLabel.ascx' не может найти IViewDataContainer. ViewUserControl должен находиться внутри ViewPage, ViewMasterPage или другого ViewUserControl.

Обычно конечный эффект, которого я хочу достичь, - это загрузка элементов управления с некоторыми параметрами, эти параметры должны быть доступны для чтения в шаблоне (ascx).

пример:

<% Html.EditableLabel(Writer, "memberName", "Name", "Antonio", "/identity/updateProperty", "memberName"); %>
  1. Есть ли способ передать ViewData в экземпляр ViewPage, который я создаю?
  2. Есть ли более умный способ создания пользовательских элементов управления / виджетов в ASP.NET MVC?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 21 февраля 2009

Я отслеживаю с zihotki на этом. С # 2 я добавлю оговорку, однако. В реализации по умолчанию, в которой в качестве представлений используются кастрированные ASPX и ASCX, создание элементов управления MVC (используйте шаблон, чтобы убедиться, что ваша собака кастрирована) является наилучшим вариантом.

Теперь для предостережения. ASPX и ASCX не должны быть представлениями. Если вы загляните в блог Фила Хаака, то увидите и другие упомянутые движки, например Spark View Engine ( Демонстрация северного ветра ASP.NET MVC с использованием Spark View Engine ). Фактически Фил установил пример использования альтернативных механизмов представления в этой записи: Рендеринг одного представления с использованием нескольких ViewEngines .

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

Кстати, если вы серьезно относитесь к MVC как к истории UI, вам следует взглянуть на проекты codeplex для MVC . Возможно, наиболее важным здесь является MVC.Contrib, но в списке есть еще несколько драгоценных камней.

2 голосов
/ 21 февраля 2009
  1. Вы можете передать VD VP с контроллера через «return View (...)» или через «ViewData [name] = value».
  2. Лучше использовать элементы управления ascx, которые унаследованы от ViewUserControl, чтобы создать собственный элемент управления. Таким образом, вы легко можете передать ему данные:

    <% Html.RenderPartial("FooControl", new FooViewData(){ Name="aa",  Type="awesome", Id = 2}); %>
    <% Html.RenderPartial("FooControl", new FooViewData(){ Name="aa", Type="awesome", Id = 2}, ViewData); %>
    

И все необходимые параметры, которые вы можете определить в своем классе FooViewData.

Если вы действительно хотите написать расширение для HtmlHelper, которое будет загружать некоторые элементы управления ascx, вы должны посмотреть на класс Repeater в MvcFutures (источники MVC здесь ). Но я уверен, что в общем случае это вам не понадобится.

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