it-swarm.com.de

HTML-Code einer Teilansicht aus dem Controller heraus holen

Ich habe einen einfachen Mechanismus für meine mvc-Website entwickelt, um html über Jquery einzuholen, das dann ein angegebenes div auffüllt. Alles ist gut und es sieht cool aus.
Mein Problem ist, dass ich jetzt HTML-Markup in meinem Controller erstellt (was in VB.net übrigens sehr einfach ist).

Kann ein benutzerdefiniertes "MVC View User Control" verwendet werden, um diese Anforderungen zu erfüllen? Kann ich eine Instanz eines Steuerelements erstellen, die Modelldaten übergeben und in HTML rendern? Es wäre dann eine einfache Sache, zu rendern und zum aufrufenden Browser zurückzukehren.

27
Andrew Harry

Sie haben mehrere Möglichkeiten.

Erstellen Sie in Ihrem Controller ein MVC View User Control und einen Aktionshandler für die Ansicht. Um die Ansicht zu rendern, verwenden Sie 

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

In diesem Fall muss Ihr Action-Handler die Modelldaten an die Ansicht übergeben

public ActionResult MyControl ()
{
    // get modelData

    render View (modelData);
}

Ihre andere Option besteht darin, die Modelldaten von der übergeordneten Seite zu übergeben. In diesem Fall benötigen Sie keinen Aktionshandler, und der Modelltyp entspricht dem übergeordneten Element:

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

Wenn Ihr Benutzersteuerelement einen eigenen Datentyp hat, können Sie es auch innerhalb der Seite erstellen

In 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>
{
}

Und auf Ihrer Seite können Sie das Datenmodell Ihres Steuerelements initialisieren:

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

Dies ist eine Lösung, die mit ASP.Net MVC 1.0 arbeitet (viele, die behaupten, mit Beta 3 zu arbeiten, funktionieren nicht mit 1.0). Das Problem, dass der Server den Inhaltstyp nicht festlegen kann, nachdem HTTP-Header gesendet wurden, ist nicht der Fall und kann von einem Controller aus aufgerufen werden (nicht nur eine Ansicht):

/// <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 ist eine statische Methode, die Sie an einem beliebigen Ort ablegen können. Sie können es so nennen:

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

Ich habe ein grobes Framework zusammengestellt, mit dem Sie Ansichten aus einer Controller-Methode in MVC Beta als String darstellen können. Dies sollte vorerst helfen, diese Einschränkung zu lösen.

Außerdem habe ich ein Rails-ähnliches RJS-Javascript-Generierungs-Framework für MVC Beta zusammengestellt.

Schau es dir unter http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc an und lass mich wissen, was du denkst.

8
Kevin Zink

Sie würden Ihre Aktion folgendermaßen erstellen:

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

Und die Aktion würde die gerenderte Teilansicht auf Ihre Abfrageantwort zurückführen.

Ihre Anfrage könnte ungefähr so ​​aussehen:

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

Sie sollten Jquery verwenden, um Ihre divs aufzufüllen (und ggf. neue HTML-Elemente zu erstellen) und Json-Serialisierung für ActionResult. 

Eine andere Möglichkeit ist, Jquery zu verwenden, um einen Controller oder eine Aktion aufzurufen. Stattdessen verwendet Json reguläre View-Funktionen (Aspx oder Ascx, Webforms View Engine) zum Rendern von Inhalten. Dies ist der halbe Weg zu UpdatePanels von asp.net ajax ... 

Ich würde wahrscheinlich mit der ersten Methode, mit Json, gehen, wo Sie etwas mehr Arbeit zu erledigen haben, aber es ist viel mehr "optimiert", da Sie nicht ganze HTML über das Kabel übertragen, es gibt nur serialisierte Objekte. Es ist die Art und Weise, wie "große" (gmail, g docs, hotmail, ...) es tun - viel JS-Code, der mit der Benutzeroberfläche manipuliert wird.

Wenn Sie kein Ajax benötigen, haben Sie grundsätzlich zwei Möglichkeiten, Teilansichten aufzurufen:

  • html.renderpartial ("name of ascx")
  • html.RenderAction (x => x.ActionName) von Microsoft.web.mvc (MVC-Futures)
5
Hrvoje Hudo

Nach langem Graben in Google habe ich die Antwort gefunden. Sie können keinen einfachen Zugriff auf die HTML-Ansicht erhalten, die von der Ansicht ausgegeben wird.

http://ayende.com/Blog/archive/2008/11/11/another-asp.net-mvc-bug-rendering-views-auf-different-output-source.aspx

4
Andrew Harry

Ich habe etwas Ähnliches für eine App gemacht, an der ich gerade arbeite. Ich habe Teilansichten, die gerenderten Inhalt zurückgeben können, indem der Pfad REST oder Folgendes verwendet wird:

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

Dann habe ich in meinem HTML-Display ein DIV, das von jQuery gefüllt wird:

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

Die jQuery sieht folgendermaßen aus:

<script type="text/javascript">
    $.ajaxSetup({ cache: false });

    $(document).ready(function () {
        $('div.onload').each(function () {
            var source = $(this).html();
            if (source != "") {
                $(this).load(source);
            }
        });
    });
</script>

Dabei wird nach allen DIV gesucht, die der Klasse "onload" entsprechen, und der Pfad REST wird aus ihrem Inhalt gelesen. Es führt dann jQuery.load für diesen REST - Pfad aus und füllt das DIV mit dem Ergebnis auf.

Tut mir leid, ich muss meine Fahrt nach Hause machen. Lass es mich wissen, wenn du mehr ausarbeiten willst.

3
Rob King

Ich habe festgestellt, dass dieser einzeilige Code einwandfrei funktioniert. orderModel ist mein Modellobjekt. In meinem Fall hatte ich eine Hilfsmethode, bei der ich die HTML einer Teilansicht zusammenführen musste.

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

es ist sehr einfach, Sie müssen nur eine stark typisierte Teilansicht (oder ein Benutzersteuerelement) erstellen und dann in Ihrem Cotroller etwa Folgendes:

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

dann können Sie JQuery verwenden, um die Anforderung auszuführen, wann immer Sie möchten:

$.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(){ }
 });    
0
Paco Lf

In Rails wird dies als Teilansicht bezeichnet, und Sie machen dies mit render :partial => 'yourfilename'. Ich glaube, dass ASP.NET MVC eine ähnliche RenderPartial-Methode hat, aber ich kann nicht die offiziellen Dokumente für MVC finden, die so etwas bestätigen oder dementieren.

0
Orion Edwards