Пользовательские элементы управления с помощью 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>
но похоже, что в рендеринге игнорируются пользовательские элементы управления.
Кто-то может помочь?
... Возможно, это немного старомодно, но иногда и пользовательский контроль может быть полезен для очистки вашего кода!
Ответы
Ответ 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));
}