2009-11-07 16 views
5

Disculpe si esta es una pregunta básica: tengo problemas para realizar la transición mental a ASP.NET MVC desde el marco de la página.Encapsulando controles de usuario en ASP.NET MVC

En el marco de página, a menudo uso archivos ASCX para crear pequeños fragmentos encapsulados de funcionalidad que se incluyen en varios lugares de un sitio. Si estoy construyendo una página y necesito uno de estos controles, solo agrego una referencia y todo funciona.

Por lo que puedo decir, en MVC, el archivo ASCX es solo una vista parcial . ¿Esto significa que siempre que quiera agregar una de estas unidades de funcionalidad también tengo que agregar algún código al método de acción del controlador para asegurarme de que ViewData relevante esté disponible para ASCX?

Si este es el caso, parece un poco un paso atrás para mí. Significa, por ejemplo, que no podía simplemente 'soltar' un control en una página maestra sin tener que agregar código a cada controlador cuyas vistas usan esa página maestra.

Sospecho que me estoy perdiendo algo: cualquier ayuda sería apreciada.

Gracias, - Chris

+0

no pido disculpas porque esto no es cierto, todos los lectores que lean este blog son expertos en asp.net o mvc –

+0

+1 para su gramática de preguntas; editan mi pregunta, luego acceden a mi perfil y luego editan mi pregunta porque no tengo un buen conocimiento en inglés –

Respuesta

3

Por lo que yo puedo decir, en MVC, el archivo ASCX es sólo una visión parcial. ¿Quiere esto decir que allí donde Quiero añadir una de estas unidades de funcionalidad también tengo que añadir algo de código de método de acción del controlador para hacer que el ViewData relevante es a disposición del ASCX?

Sí.

Sin embargo, puede utilizar un método RenderAction en su vista en lugar de RenderPartial, y toda su funcionalidad (incluyendo los datos que se pasan a la sub-view) será encapsulado.

En otras palabras, esto creará un pequeño paquete que incorpora un método de controlador, datos de vista y una vista parcial, que se puede llamar con una línea de código desde su vista principal.

+0

Excelente - ¡RenderAction es la pieza del rompecabezas que me faltaba! ¡Muchas gracias! –

+0

También eche un vistazo a esta publicación http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/ para algunas otras alternativas. – joshperry

+0

Aquí hay una mejor visión general de RenderAction: http://blogs.intesoft.net/post/2009/02/renderaction-versus-renderpartial-aspnet-mvc.aspx –

1

Puede renderizar una vista parcial y pasar un objeto modelo a.

<% Html.RenderPartial("MyPartial", ViewData["SomeObject"]); 

En su opinión parcial (.ascx) archivo, a continuación, puede utilizar el objeto "Modelo" (suponiendo que has heredado el objeto propio de su desaceleración de control @) para hacer lo que necesita con ese objeto .

Por supuesto, no puede pasar y modelar y simplemente tomar el texto de la vista parcial y colocarlo donde lo desee.

En su vista principal (archivo .aspx), deberá definir el objeto adecuado en ViewData que está pasando a la vista parcial.

Otro método que puede hacer es usar:

<% Html.RenderAction("MyAction", "MyController", new { Parameter1="Value1"}) %> 

Lo que el método anterior es llamar a una acción del controlador, siga su respuesta, y colocarlo en el que llama la "RenderAction()" método.Es el equivalente a ejecutar una solicitud en contra de una acción de controlador y leer la respuesta, excepto que coloca la respuesta en otro archivo.

Google "renderaction and renderpartial" para obtener más información.

+0

Excelente - RenderAction es la pieza del rompecabezas que me faltaba! ¡Muchas gracias! –

2

Su pregunta ya ha sido respondida, pero solo para completar, hay otra opción que a veces puede parecer atractiva.

¿Has visto cómo se enmascaran los "controles" en ASP.NET MVC? Son métodos del "HtmlHelper". Si quieres un cuadro de texto con destino a "Nombre", por ejemplo, se puede hacer:

<%= Html.Textbox("FirstName") %> 

Y tiene cosas por el estilo para muchos controles estándar.

Lo que puedes hacer es crear tus propios métodos así. Para crear su propio método, usted tiene que crear un método extensión en la clase HtmlHelper, así:

public static class HtmlHelperExtensions 
{ 
    public static string Bold(this HtmlHelper html, string text) 
    { 
     return "<b>" + text + "</b>\n"; 
    } 
} 

Luego, en su opinión, después de abrir el espacio de nombres que contiene esta definición de clase, se puede utilizar de esta manera :

<%= Html.Bold("This text will be in bold-face!") %> 

Bueno, esto no es particularmente útil. Pero puedes hacer cosas muy interesantes. Uno que uso bastante a menudo es un método que toma una enumeración y crea una lista desplegable con los valores de esta enumeración (por ejemplo, enum Gender { Male, Female }, y en la vista algo así como Gender: <%= Html.EnumDropDown(Model.Gender) %>).

¡Buena suerte!

Cuestiones relacionadas