2011-01-13 5 views
0

Ich habe zwei Ansichten, die beide die gleiche Controller-Methode verwenden:Wie gebe ich zwei verschiedene Ansichten von derselben Aktion in ASP.NET MVC zurück?

//webServiceController.cs 

//The actual method is about 40 lines of code. Truncated for readability. 
public ActionResult Index() 
{ 
    object i = new List<WebServiceMethod>(); 
    i = svcService.populateList("Programs"); 

    return View(i); 

} 

Die erste Ansicht ist eine HTML-Seite, die die Daten in einer hübschen Tabellenausgabe zeigt:

<% // Index.aspx %> 

<table> 
<tbody> 
<% foreach (var item in Model) { %> 

<tr> 
    <td> 
     <% if (Convert.ToInt32(item.numberRequests) > 0) 
     {%> 
      <%= Html.ActionLink("Details", "Details", new { programNumber = item.programNumber })%> 
     <%} %> 
    </td> 
    <td> 
     <%= Html.Encode(item.programNumber) %> 
    </td> 
</tr> 

<% } %> 
</tbody> 
</table> 

Die zweite Ansicht ist eine quick'n'dirty Umwandlung in JSON, so dass ich magische AJAX Tricks mit den Daten tun können:

<% 
    // AjaxGetServiceData.aspx 

    // Convert web service response object into JSON for AJAX. 
    var jss = new System.Web.Script.Serialization.JavaScriptSerializer(); 
    Response.Write(jss.Serialize(Model)); 

%> 

ich ein Duplikat dererstellt hatteMethode und nannte es AjaxGetServiceData(), aber das vereitelt den Zweck von MVC.


Auflösung:

Ich habe nicht meine Frage sehr gut, wie von 5-10 Minuten Diskussion belegen ich mit einem Kollegen über dieses Thema sehr einfach hatte. Er stellte mir immer wieder dieselbe Frage, die mich viele Benutzer auf dieser Seite gefragt haben: "Wie weiß der Controller, welche Ansicht er zurückgeben soll?" Ich antwortete: "Das versuche ich herauszufinden." Ich versuchte, die Methode zu erhalten, eine andere Ansicht (oder Json-Ausgabe) zurückzugeben, wenn AJAX der Anforderer war. Ein String-Argument in der Methode war meine Lösung.

Dies ist, was ich meine gewünschten Effekt am Ende mit bekommen:

public ActionResult Index(string isJSON = "no") 
{ 

    /// ...All the code from before... 

    if (isJSON == "yes") 
    { 
     return Json(i, JsonRequestBehavior.AllowGet); 
    } 
    else 
    { 
     return View(i); 
    } 

} 

Dann, wenn ich die JSON-Version will, muss ich in meiner AJAX-Anforderung die URL als /MyController/Index/?isJSON=yes

angeben, wenn ich will meine hübsche Tabellenansicht, ich /MyController/

+0

Stehen Sie zu ** kombinieren versuchen * * diese beiden Code-Fragmente in eine einzige HTML-Seite? –

+1

Gibt es einen bestimmten Grund dafür, dass Ihre Ansicht JSON aus dem Modell und nicht von Ihrem Controller generiert? Es scheint mir, als ob du 'jon (i);' 'für die JSON-Ausgabe verwenden solltest. –

+0

Nein; Die AJAX-Ansicht wird für einen ganz anderen Bereich der Site verwendet. – Jake

Antwort

3
public ActionResult Index() 
{ 
    object i = new List<WebServiceMethod>(); 
    i = svcService.populateList("Programs"); 

    if (someCondition) 
     return View(i); 
    else 
     return View("AjaxGetServiceData", i); // or whatever you called your view.aspx 
} 
+0

Ich weiß nicht, was 'someCondition' wäre das. – Jake

+1

Was ist der Punkt der Instantiierung von" i "und sofort die Freigabe durch Zuweisung von' svcService.populateList() 'dazu, wodurch alle Verweise auf die neu erstellte' List () '? –

+0

@Jake? Wenn du das nicht tust, wie kannst du sonst irgendjemanden erwarten? @David, nicht bekommen Sie Ihre Höschen in einem Haufen, fügte ich das Modell – hunter

2

benutzen Sie einfach es klingt wie Sie zwei unterschiedliche Zwecke haben, in dem Fall, dass ich glaube, Sie den richtigen Weg gehen wenn Sie über verschiedene Controller-Methoden sprechen.

Sicher, Code innerhalb jeder Controller-Methode wiederverwenden, aber wenn Sie ein anderes Ergebnis wollen, verwenden Sie eine andere Methode und halten Sie die Controller-Methoden einfach.

0

„... Ich habe versucht, die Methode zu bekommen eine andere Ansicht (oder Json Ausgabe) zurückzukehren, wenn AJAX der Anforderer ... war“

public ActionResult Index() 
{ 
    object i = new List<WebServiceMethod>();  
    i = svcService.populateList("Programs");  

    if (Request.IsAjaxRequest == "True") 
    { 
     return Json(i, JsonRequestBehavior.AllowGet);   
    } 
    else 
    { 
     return View(i) 
    } 
} 
Verwandte Themen