net mvc component asp asp.net asp.net-mvc user-controls controller viewdata

component - ¿Cómo se usan los controles de usuario en asp.net mvc que muestran una "isla" de datos?



tempdata mvc (4)

En MVC Futures, 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 harías

<% 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.

Estoy tratando de descubrir cómo usar 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.

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 pasarlos al control de usuario desde solo uno colocar 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 usa.


Hay múltiples formas de hacerlo.

El enfoque básico es

  • Complete los datos para la vista en el BaseController (evento OnActionExecuting)
  • Escribir un filtro de acción personalizado
  • Escribir un controlador de aplicación (el ejemplo se encuentra en los enlaces a continuación).

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 usar los datos de vista de "etiquetas" en cualquier 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/


Refactorice 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 usando la clave conocida.