2009-02-21 4 views
1

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

После долгих поисков в Интернете и борьбы с этой проблемой я, наконец, подумал о создании вспомогательных методов, которые используют ASP view Engine, который думал о классе ViewPage.

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

The ViewUserControl '~/Components/Controls/EditableLabel/Views/EditableLabel.ascx' cannot find an IViewDataContainer. The ViewUserControl must be inside a ViewPage, ViewMasterPage, or another ViewUserControl.

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

пример:

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

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

ответ

2
  1. Вы можете передать VD к VP от контроллера через "возвращение View (...)" или через "ViewData [имя] = значение".
  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: here). Но я уверен, что в общем случае вам это не понадобится.

+1

Если вы используете защиту, вероятность прохождения VD значительно снижается –

+0

Что вы подразумеваете под «защитой» и почему она уменьшена? Элементы управления могут использовать привязки значений, чтобы они могли загружать значения из ViewDataDictionary или из модели. – zihotki

+0

@Rexm lol! @zihotki наслаждаются бризом. –

2

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

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

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

Кстати, если вы серьезно попадаете в MVC в качестве своего пользовательского интерфейса, you should look at the codeplex projects for MVC. Наиболее важным здесь является, вероятно, MVC.Contrib, но в списке есть еще несколько камней.

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