2008-11-29 23 views
9

Estoy tratando de averiguar cómo usar los controles de usuario en asp.net mvc. Sé cómo agregar un control de usuario a una vista y cómo pasarle datos. Lo que no he podido descifrar es cómo hacerlo sin tener que recuperar y pasar los datos en cada controlador individual.¿Cómo se usan los controles de usuario en asp.net mvc que muestran una "isla" de datos?

Por ejemplo, si tengo un control de usuario que muestra las publicaciones más recientes en varias pero no en todas las páginas del sitio, ¿cómo escribo los Controladores para obtener datos para ese control de usuario y pasárselos al usuario? controlar desde un solo lugar en el sitio web en lugar de obtener y pasar datos en cada uno de los diferentes controladores en los que se usa el control del usuario?

No estoy seguro si esto tiene sentido o no. ¿Existe una forma mejor o más recomendada de manejar una "isla" de datos que desea visualizar en varias páginas?

Vengo de formularios web donde podría simplemente escribir un control de usuario que obtuviera sus propios datos y datos mostrados independientemente del resto de la página en la que se utiliza.

Respuesta

11

Existen varias formas de hacerlo.

El enfoque básico es

  • pueblan los datos para la vista en el (evento OnActionExecuting) BaseController
  • Escribir un filtro de acción personalizada
  • Escribir un Controlador de aplicación (el ejemplo. Se encuentra en el siguiente campo de golf).

Un ejemplo de OnActionExecuting será

[HandleError] 
    public class BaseController : Controller 
    { 
     CourseService cs = new CourseService(); 
     protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      List<Tag> tags = cs.GetTags(); 
      ViewData["Tags"] = tags; 
     } 

    } 

Puede utilizar los "tags" ver datos en cualquier punto de vista. Este es solo un ejemplo de usercontrol que se representa como contenido secundario.

<div id="sidebar_b"> 
     <asp:ContentPlaceHolder ID="ContentReferenceB" runat="server" > 
      <% Html.RenderPartial("Tags"); %> 
     </asp:ContentPlaceHolder> 
    </div> 

Encontré la siguiente URL para ser útil.

http://weblogs.asp.net/stephenwalther/archive/2008/08/12/asp-net-mvc-tip-31-passing-data-to-master-pages-and-user-controls.aspx

http://blog.matthidinger.com/2008/02/21/ASPNETMVCUserControlsStartToFinish.aspx

http://www.aaronlerch.com/blog/2008/01/26/displaying-foo-on-every-page-of-an-aspnet-mvc-application/

http://blog.wekeroad.com/2008/01/07/aspnet-mvc-using-usercontrols-usefully/

+0

¿Alguna idea sobre cómo hacer esto con una vista fuertemente tipada? –

+0

No importa, acabo de ponerlo en OnActionExecuted, que funcionó muy bien. –

0

Refacturar el código que obtiene los datos de vista para este control de usuario en su propio método, tal vez incluso su propio modelo (clase). Llame a este método desde cada controlador que necesita completar el control y pase los resultados en ViewData con una clave conocida. Es posible que desee pasar el tipo del controlador actual a su método en caso de que necesite saber qué datos recuperar en función del modelo base para el controlador.

ViewData["RecentPosts"] = RecentPosts.GetRecentPosts(this.GetType()); 

En su control, recupere los datos utilizando la clave conocida.

+0

¿Hay alguna manera de implementarlo para que no tenga que hacer una llamada de clase/método en cada controlador que va a pasar datos a una vista que retiene el control del usuario? – dtc

+0

No realmente, debe obtener los datos llenados en ViewData de alguna manera. La respuesta de @Rajesh tiene algunas sugerencias para facilitar la derivación derivando los controladores de una clase base que implementa esto para todos los controladores secundarios. – tvanfosson

0
+0

Puede verificar el enfoque anterior que he resaltado para el contenido lateral. De hecho, estoy usando las "Etiquetas" como contenido secundario. Puede tener un "control de usuario" de contenido secundario y rellenar sus datos en el controlador base para que esté disponible cuando sea necesario. –

3

En los futuros MVC, disponible en codeplex, contiene las extensiones RenderAction HtmlHelper.Esto le permitirá crear un controlador para el control ueser y este controlador rellenará ViewData utilizado por el control del usuario sin tener que recurrir a un controlador base como se sugirió.

En la vista que haría

<% Html.RenderAction("Index", "UserControlController") %> 

o una de las otras sobrecargas.

Esto creará una instancia del controlador, ejecutará el método y representará la vista de control del usuario en la vista principal. El controlador de vista principal no necesita saber nada sobre el control de usuario o su modelo/datos.

Cuestiones relacionadas