2009-07-09 14 views
2

Ich versuche, eine Funktion ähnlich den verwandten Fragen zu StackOverflow zu implementieren, mache ich dies in MVC.Wie bekomme ich HTML von ActionResult in Controller

$().ready(function() { 
    var s = $("#Summary").val(); 
    $("#Summary").blur(function() { QuestionSuggestions(s); }); 
}); 

function GetPastIssues(title) { 

$(document).ready(function() { 
$.ajax({ type: "POST", 
    url: "/Issue/GetSimilarIssues", 
    contentType: "application/json; charset=utf-8", 
    dataType: "xml", 
    dataType: "json", 
    data: "{'title':'" + title + "'}", 
    processData: false, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { ajaxError(XMLHttpRequest, textStatus, errorThrown); }, 
    success: function(xml) { ajaxFinish(xml); } 
    }); 
}); 

function ajaxFinish(xml) { 
if (xml.d != "NO DATA") { 
    $('#question-suggestions').html(xml.d); //alert(xml.d); // This ALERT IS returning undefined 
    $('#question-suggestions').show(); 
} 
} 

Die Daten von meinem Controller zurückgegeben wird ist ‚undefiniert‘, wie durch die Linie in kommentierten ajaxFinish gezeigt.
Was mache ich falsch?

//[AcceptVerbs(HttpVerbs.Get)] 
[JsonParamFilter(Param = "title", TargetType = typeof(string))] 
public ActionResult GetSimilarIssues(string title) 
{ 
    var issues = _db.GetSimilarIssues(title).ToList(); 
    if (title == null || issues.Count() == 0) 
     return Json("NO DATA"); 

    string retVal = null; 
    foreach (Issue issue in _db.GetSimilarIssues(title)) 
    { 
     retVal += "<div class='answer-summary' style='width: 610px;'>"; 
     retVal += "<a href='Issue.aspx?projid=" + issue.ProjectId.ToString() + "&issuetypeid=" + issue.IssueTypeId.ToString() + 
       "&issueid=" + issue.IssueId.ToString() + "'>"; 
     retVal += issue.Summary; 
     retVal += "</a>"; 
     retVal += "</div>"; 
    } 
     return Json(retVal); 
    } 

EDIT:

Ich denke, was mir helfen wird, eine Lösung für mein senario lernen und implementieren, wenn ich einen kleinen Einblick in bekommen, wie Stackoverflow diese Javascript-Methode implementiert:

function QuestionSuggestions() { 
     var s = $("#title").val();    
     if (s.length > 2) { 
      document.title = s + " - Stack Overflow"; 
      $("#question-suggestions").load("/search/titles?like=" + escape(s)); 
     } 

Sieht aus wie ein 'Suche' Ordner im Ordner Ansichten und eine PartialView namens 'Titel '. Ein SearchController CS- mit folgenden Methode:

public ActionResult titles(string like) 
{ 
    // HOW TO IMPLEMENT THIS 
    return PartialView("Titles"); 
} 

Was geht in der Titles.ascx die HTML angezeigt werden?

+0

Ich sammle, dass die beste Praxis ist, ein JSON-Objekt zurückgeben und eine Sicht auf das Rendering kümmern. Wie schaffst du es oben mein Szenario oben? Ich bin mir nicht sicher, wie ich die Methode in den Controller schreiben soll und wie die Teilansicht aussehen und wie sie geladen werden soll. – Picflight

Antwort

4

Der Zweck JSON() ist ein JSON-Objekt zurück - nicht HTML. JSON-Objekt wäre etwas wie {html_value: "<li> blah"}. Ich bin mir nicht sicher, was deine Ajax-Anfrage erwartet. Wenn es JSON erwartet (Sie haben datatype gesetzt zweimal), dann können Sie etwas tun, wie mit einem anonymen Objekt:

return Json(new {html_value = retVal}); 

Wenn Sie jedoch HTML-Code aus Ihrem Controller zurückkehren wollen - nicht. Das ist genau was für eine Ansicht ist. Erstellen Sie eine Ansicht ohne eine Masterseite, führen Sie die Schleife aus, und geben Sie den HTML-Code auf diese Weise zurück. Ajax-Apps können diesen HTML-Code verwenden und ihn bei Bedarf löschen.

In der Tat, während Sie technisch das oben anonyme Objekt tun könnten (wo Sie den HTML innerhalb eines JSON-Objekts zurück), das ist nicht das, was es ist. Wenn Sie JSON verwenden möchten, sollten Sie Werte zurückgeben und das Javascript auf dem Client formatieren lassen:

Ich bin mir nicht sicher, wie "schwer" Ihre Probleme Objekt ist, aber angenommen, dass es nur die drei Felder Sie hat verwende es. In diesem Fall tun:

return Json(issues); 

EDIT:

Nun, ich denke, "Best Practice" würde nur die Werte über JSON und Format innerhalb der Javascript zurückkehren. Ich kenne JSON() nicht genug, aber ich weiß, dass es funktioniert (ich benutze es für etwas Einfaches). Versuchen Sie, eine einfache Probleme mit nur diesen drei Werten Objekt erstellen und

return Json(issuesTxfr); 

Sie brauchen nicht partialviews zu verwenden, wie Sie von einem Controller sind aufgerufen wird. Betrachten Sie es einfach als eine sehr einfache Sichtweise.Hier ist ein Beispiel von mir (beachten Sie bitte nicht, dass ich nicht meinen eigenen JSON Rat folgende - das von einer Weile ist wieder da und ich jetzt bei ihm für ein paar Gründe erschaudern suchen):

public ActionResult Controls_Search_Ajax(string q, string el) 
    { 
     ... 

     ViewData["controls"] = controls; 
     ViewData["el"] = el; 

     return View(); 
    } 

und

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Controls_Search_Ajax.aspx.cs" Inherits="IRSoxCompliance.Views.Edit.Controls_Search_Ajax" %> 
<% var controls = ViewData.Get<IEnumerable<IRSoxCompliance.Models.Control>>("controls"); 
    var el = ViewData.Get<String>("el"); 

    if (controls != null) 
    { 
    foreach (var c in controls) 
    { 
%><%= c.Control_ID %>***<%= c.Full_Control_Name %>***<li id="<%= el %>:li:<%= c.Control_ID %>"><span class="item"><%= Html.BreadCrumb(c, false) %></span><span class="actions"><a href="#" onclick="sx_Remove_Control('<%= el %>', <%= c.Control_ID %>); return false;">Remove</a></span><br></li> 
<% } 
    } 
%> 

Beachten Sie, dass keine Masterseite angegeben ist.

+0

Ich hatte bereits versucht, Json (Ausgaben) zurückzugeben; aber aus irgendeinem Grund bekam ich keine Ergebnisse zurück. Ich mag die Idee, eine neue Ansicht zu haben, die Schleife zu machen und das HTML zu erzeugen, aber ich habe keine Idee, wie man das macht. Können Sie auf eine Probe zeigen? Vielen Dank – Picflight

1

Sie könnten HTML immer als Zeichenfolge zurückgeben. Ich sage nicht, dass dies notwendigerweise der Weg ist, und ich stimme James Shannon zu, dass ich JSON nicht verwende, um HTML zurückzugeben.

Phil Haack schrieb eine hervorragende article darüber in seinem Blog im Mai.

Verwandte Themen