Подтвердить что ты не робот

Пользовательские элементы управления с помощью ASP.NET MVC Razor

Как я могу использовать настраиваемые элементы управления с помощью ASPNET.MVC Razor?

Я хочу использовать настраиваемый элемент управления в представлении Razor. например:

<mycontrols:something>@Model.MyVar</mycontrols:something>

или

<mycontrols:something myattribute="@Model.MyVar" />

Обратите внимание, что моя цель состоит в том, чтобы использовать только несколько элементов управления, полученных из MvcControl, только для тривиальных повторяющихся ui файлов.

Я попытался найти синтаксис, похожий на @Register, чтобы писать в верхней части представления, но без каких-либо успехов.

Затем я пошел в web.config, добавив

<pages>
   <controls>
      <add tagPrefix="mycontrols" namespace="mynamespace" assembly="myassembly"/>
   </controls>
</pages>

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

Кто-то может помочь?

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

4b9b3361

Ответ 1

Синтаксис Razor вообще не поддерживает понятие Controls. Если вы хотите использовать элементы управления, вам придется использовать синтаксис ASPX (WebForms).

Однако рекомендуемый шаблон MVC заключается в использовании вспомогательных функций html или частичных представлений. В Razor вы также можете использовать синтаксис @helper для быстрых вспомогательных функций.

Ответ 2

В ASP.NET MVC настраиваемые серверные элементы управления следует избегать. Большинство из них полагаются на ViewState и PostBack, которые являются понятиями, которые больше не существуют в MVC. Вы должны использовать шаблоны, HTML-помощники для реализации некоторых функций многократного использования. Еще одна проблема с элементами управления - большинство из них инкапсулирует некоторую бизнес-логику, которая извлекает данные откуда-то и отображает ее, что является шаблоном анти-MVC. В MVC ответственность диспетчера заключается в том, чтобы манипулировать моделью и получать данные и передавать модель представления в представление, которое просто должно отображать его.

Ответ 3

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

  • RenderPartial, который отображает данные, уже полученные контроллером страницы
  • RenderAction, который похож, но имеет свое собственное действие контроллера, поэтому может получать данные независимо.

Единственный сценарий, в котором я могу думать о том, куда стоит добавить настраиваемый элемент управления в представлении mvc, - это то, что вы работаете над частично перенастроенным проектом webforms, и я сомневаюсь, что это сработает с чем-либо, кроме WebFormsViewEngine.

Ответ 4

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

Единственный способ сделать это - это немного взломать, потому что бритва не поддерживает элементы управления элементами webforms. Тем не менее, он поддерживает частичные представления, сделанные в окне просмотра веб-форм. Итак, хакерское решение состоит в том, чтобы включить в него частичный вид с вашим контролем:

Например, скажите, что вы хотите использовать ленту web-сайта office в проекте mvc3, вы можете сделать это, включив

<body>
    <div>
        @Html.Partial("_RibbonPartial")
    </div>
</body>

в вашем представлении. Где _Ribbon имеет тип .aspx

то в частичном представлении просто используйте свой элемент управления и установите runat = "server" и поместите его внутри формы с помощью runat = "server"

//_Ribbon.aspx
<form id="form1" runat="server">
    <XyzControls:Manager ID="Manager1" runat="server" UITheme="Silver" />
    <XyzControls:OfficeRibbon ID="OfficeRibbon1" runat="server" ApplicationMenuColor="#267c29"
        ApplicationMenuText="Item" ApplicationMenuType="Backstage">
//... rest of control code
</form>

Затем вам нужно использовать ajax для реализации событий вместо использования обратной передачи.

Затем, чтобы очистить, избавиться от сгенерированного кода от механизма просмотра веб-форм для сообщения, которое вам не нужно. Вы можете попытаться сохранить его, я не так, я не уверен, что произойдет. Я знаю, что есть способы иметь поддельное viewstate, если вы действительно хотите попасть в грязный хакерский материал, но чтобы удалить дополнительный код из веб-форм, вы можете использовать следующий jquery:

$(function ()
{
    // we don't need any of the webforms stuff
    $("#__EVENTTARGET","#aspnetForm").parents("div:first").remove();
    $("#__EVENTVALIDATION","#aspnetForm").parents("div:first").remove();
});

Ответ 5

У меня было такое же требование. Требуется использовать пользовательский веб-контроль с страницы Razor/MVC. Не следует делать это с помощью элементов управления, которые обрабатывают обратную передачу. У вас нет eventcycle для поддержки этого, но если ваше единственное требование - использовать "средство управления рендерингом", вы можете создать его в бритве и контролировать, где происходит рендеринг:

@{
  var myControl = new mycontrols.something();
  myControl.myattribute = Model.MyVar;
  mycontrol.RenderControl(new HtmlTextWriter(this.Output));
}