vistas vista una parciales parcial pagina net mvc multiples modelos modal misma llamar desde con boton asp asp.net-mvc viewusercontrol render-html

asp.net-mvc - una - vista parcial en modal mvc



Obtener un HTML de vista parcial desde el interior del controlador (10)

Desarrollé un mecanismo simple para que mi sitio web mvc extraiga html a través de jquery, que luego rellena un div especificado. Todo está bien y parece genial.
Mi problema es que ahora estoy creando código HTML dentro de mi controlador (lo cual es muy fácil de hacer en VB.net por cierto) Prefiero no mezclar la separación de preocupaciones.

¿Es posible utilizar un "Control de usuario de MVC View" personalizado para satisfacer esta necesidad? ¿Puedo crear una instancia de control, pasar los datos del modelo y renderizar a html? Entonces sería una simple cuestión de renderizar y pasar de nuevo al navegador que llama.


Debe usar jquery para completar sus divs (y crear nuevos elementos html si es necesario), y la serialización de Json para ActionResult.

Otra forma es usar jquery para llamar a algún controlador / acción, pero en su lugar json use la vista regular (aspx o ascx, webforms view engine) para representar el contenido, y con jquery simplemente inyecte ese html a algún div. Esto está a medio camino de UpdatePanels de asp.net ajax ...

Probablemente vaya con el primer método, con json, donde tienes poco más trabajo que hacer, pero está mucho más "optimizado", porque no transfieres html enteros por el cable, solo hay objetos serializados. Es la forma en que los "grandes" (gmail, g docs, hotmail, ...) lo hacen: gran cantidad de código JS que se manipula con UI.

Si no necesitas ajax, básicamente tienes dos formas de llamar vistas parciales:

  • html.renderpartial ("nombre de ascx")
  • html.RenderAction (x => x.ActionName) de Microsoft.web.mvc (mvc futures)

Deberías crear tu acción así:

public PartialViewResult LoginForm() { var model = // get model data from somewhere return PartialView(model); }

Y la acción devolvería la vista parcial representada a su respuesta jquery.

Tu jquery podría verse más o menos así:

$(''#targetdiv'').load(''/MyController/LoginForm'',function(){alert(''complete!'');});



En los rieles esto se llama hacer una vista parcial, y lo haces con render :partial => ''yourfilename'' . Creo que ASP.NET MVC tiene un método RenderPartial similar, pero no puedo encontrar los documentos oficiales de MVC para confirmar o denegar tal cosa.


Armado un marco aproximado que le permite representar vistas en una cadena desde un método de controlador en MVC Beta. Esto debería ayudar a resolver esta limitación por ahora.

Además, también armé un marco de generación de JavaScript RJS similar a Rails para MVC Beta.

Compruébelo en http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc y dígame lo que piensa.


Tienes varias opciones.

Cree un controlador de acción y control de usuario de MVC View en su controlador para la vista. Para hacer que la vista use

<% Html.RenderPartial("MyControl") %>

En este caso, su controlador de acción deberá pasar los datos del modelo a la vista

public ActionResult MyControl () { // get modelData render View (modelData); }

Su otra opción es pasar los datos del modelo desde la página principal. En este caso, no necesita un controlador de acción y el tipo de modelo es el mismo que el padre:

<% Html.RenderPartial("MyControl", ViewData.Model) %>

Si su control de usuario tiene su propio tipo de datos, también puede construirlo dentro de la página

En MyControl.ascx.cs:

public class MyControlViewData { public string Name { get; set; } public string Email { get; set; } } public partial class MyControl : System.Web.Mvc.ViewUserControl <MyControlViewData> { }

Y en su página puede inicializar el modelo de datos de su control:

<% Html.RenderPartial("MyControl", new MyControlViewData () { Name= ViewData.Model.FirstName, Email = ViewData.Model.Email, }); %>


Esta es una solución que está trabajando con ASP.Net MVC 1.0 (muchos que dicen trabajar con beta 3 no funcionan con 1.0), no sufre del problema ''El servidor no puede establecer el tipo de contenido después de que los encabezados HTTP hayan sido enviados'' y se puede llamar desde dentro de un controlador (no solo una vista):

/// <summary> /// Render a view into a string. It''s a hack, it may fail badly. /// </summary> /// <param name="name">Name of the view, that is, its path.</param> /// <param name="data">Data to pass to the view, a model or something like that.</param> /// <returns>A string with the (HTML of) view.</returns> public static string RenderPartialToString(string controlName, object viewData) { ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() }; viewPage.Url = GetBogusUrlHelper(); viewPage.ViewData = new ViewDataDictionary(viewData); viewPage.Controls.Add(viewPage.LoadControl(controlName)); StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { using (HtmlTextWriter tw = new HtmlTextWriter(sw)) { viewPage.RenderControl(tw); } } return sb.ToString(); } public static UrlHelper GetBogusUrlHelper() { var httpContext = HttpContext.Current; if (httpContext == null) { var request = new HttpRequest("/", Config.Url.ToString(), ""); var response = new HttpResponse(new StringWriter()); httpContext = new HttpContext(request, response); } var httpContextBase = new HttpContextWrapper(httpContext); var routeData = new RouteData(); var requestContext = new RequestContext(httpContextBase, routeData); return new UrlHelper(requestContext); }

Es un método estático que puede colocar en algún lugar que le resulte conveniente. Puedes llamarlo de esta manera:

string view = RenderPartialToString("~/Views/Controller/AView.ascx", someModelObject);


He hecho algo similar para una aplicación en la que estoy trabajando. Tengo vistas parciales que devuelven contenido renderizado se puede llamar usando su ruta REST o usando:

<% Html.RenderAction("Action", "Controller"); %>

Luego, en mi HTML de visualización real, tengo un DIV que está lleno de jQuery:

<div class="onload">/controller/action</div>

El jQuery se ve así:

<script type="text/javascript"> $.ajaxSetup({ cache: false }); $(document).ready(function () { $(''div.onload'').each(function () { var source = $(this).html(); if (source != "") { $(this).load(source); } }); }); </script>

Esto analiza todos los DIV que coinciden con la clase "onload" y lee la ruta REST desde su contenido. Luego hace una jQuery.load en esa ruta REST y rellena el DIV con el resultado.

Lo siento, tengo que ir a buscar mi camino a casa. Avísame si quieres que elabore más.


es muy simple solo tienes que crear una vista parcial fuertemente tipada (o control de usuario) luego en tu cotroller algo como esto:

public PartialViewResult yourpartialviewresult() { var yourModel return PartialView("yourPartialView", yourModel); }

luego puede usar JQuery para realizar la solicitud que desee:

$.ajax({ type: ''GET'', url: ''/home/yourpartialviewresult'', dataType: ''html'', //be sure to use html dataType contentType: ''application/json; charset=utf-8'', success: function(data){ $(container).html(data); }, complete: function(){ } });


Encontré este código de una línea para que funcione perfectamente. orderModel es mi objeto modelo. En mi caso, tenía un método de ayuda en el que tenía que fusionar un html de vista parcial.

System.Web.Mvc.Html.PartialExtensions.Partial(html, "~/Views/Orders/OrdersPartialView.cshtml", orderModel).ToString();