2011-01-03 24 views
19

¿Cómo puedo usar controles personalizados con ASPNET.MVC Razor?Controles personalizados con ASP.NET MVC Razor

Quiero usar un control personalizado en una vista Razor. por ejemplo:

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

o

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

Tenga en cuenta que mi objetivo es utilizar sólo unos controles derivados de MvcControl, solamente para las materias ui repetive triviales.

He intentado encontrar una sintaxis similar a @Register para escribir en la parte superior de la vista, pero sin ningún éxito.

Luego fui a la web.config, añadiendo

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

pero parece controles personalizados son ignorados en la representación.

¿Alguien podría ayudarlo?

... podría ser que es una moda poco viejo, pero a veces también de controles personalizados podría ser útil para hacer su código más limpio!

+0

Haciendo eco de las opiniones de todos los demás aquí, pero estás tomando el enfoque equivocado. Hay mejores formas de hacer lo que quieres en Razor, y de hecho, MVC en general. –

Respuesta

10

En ASP.NET MVC deben evitarse los controles de servidor personalizados. La mayoría de ellos confían en ViewState y PostBack, que son nociones que ya no existen en MVC. Debería preferir usar plantillas, ayudantes de HTML para implementar alguna funcionalidad reutilizable. Otro problema con los controles es que la mayoría de ellos encapsulan una lógica de negocios que obtiene datos de algún lugar y los procesa, que es un patrón anti-MVC. En MVC es responsabilidad del controlador manipular el modelo y obtener datos y pasar un modelo de vista a la vista que simplemente debería mostrarlo.

+0

Lo sé, pero voy a usar controles derivados de MvcControls, solo para artículos triviales de ui. – Fabrizio

+0

¿Qué quiere decir con * MvcControls *? –

+0

Me refiero a implementar controles derivados de la clase MvcControl en el espacio de nombres Microsoft.Web.Mvc.Controls del ensamblado MvcFutures. – Fabrizio

6

MVC utiliza vistas parciales en lugar de controles personalizados, y que se puede utilizar de dos maneras que cubren prácticamente todo lo que un control personalizado puede hacer

  • renderPartial que hace que los datos ya recuperada por el controlador de la página
  • RenderAction que es similar pero tiene su propia acción de controlador para poder obtener datos de manera independiente

El único escenario que puedo pensar en dónde valdría la pena poner un control personalizado en una vista de mvc es si está trabajando en un proyecto de formularios web parcialmente migrados, y dudo que funcione con algo más que el WebFormsViewEngine.

19

La sintaxis de Razor no admite la noción de Controles. Si desea usar controles, deberá usar la sintaxis ASPX (WebForms).

Sin embargo, el patrón MVC recomendado es utilizar funciones html helper o vistas parciales. En Razor también puede usar la sintaxis @helper para funciones de ayuda rápida.

+0

Creo que es importante tener en cuenta que la "sintaxis ASPX" puede ser engañosa aquí. He visto preguntas de personas que preguntan cómo usar controles de servidor en ASP.NET MVC usando el motor de vistas ASPX. ¡Pero sí, tu respuesta es correcta! –

1

Puede hacer esto, aunque no lo recomiendo, aunque no estoy aquí para juzgarlo. Debo agregar que no espero que la devolución de datos y el estado de la vista continúen funcionando, pero al menos puedes renderizar todo el html.

La única forma de hacerlo es un poco complicado, ya que la afeitadora no es compatible con los formularios web y los controles del motor. Sin embargo, admite vistas parciales realizadas en el motor de vistas de formularios web.Así que una solución hacky es incluir una vista parcial con su mando en ella como tal:

Por ejemplo, supongamos que desea utilizar la cinta de interfaz de usuario web de la oficina en su proyecto MVC3, podría hacerlo incluyendo

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

en su vista. Donde _Ribbon es de tipo .aspx

entonces en su vista parcial Sólo tiene que utilizar su control y establece runat = "server" y ponerlo dentro de un formulario con 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> 

Luego hay usar ajax para implementar eventos en lugar de usar la devolución de datos.

Luego, para limpiar, deshacerse del código generado de los formularios web ver el motor para la publicación posterior que no necesita ... Puede intentar conservarlo, no lo he hecho así que no estoy seguro de lo que sucederá. Sé que hay maneras de tener un estado de vista falso, así que si realmente desea conseguir en la materia hacky desordenado, pero para eliminar el código extra de formularios web puede utilizar la siguiente jQuery:

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

que tenía la misma demanda . Quería usar webcontrol personalizado de la página Razor/MVC. Uno no debería hacer eso con los controles, que es el manejo de la devolución de datos. Usted no tiene la eventcycle para apoyar eso, pero si su única demanda es utilizar un 'control de la prestación', se podía crear una instancia en la maquinilla de afeitar, y controlar la prestación donde se lleva a cabo:

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