2012-05-14 5 views
42

Sto scrivendo un'app ajax a pagina singola con ASP.NET MVC: utilizzo pesante di jQuery. Faccio qualcosa di simile al seguente in tutto l'app:ASP.NET MVC - Restituzione di PartialView a Ajax insieme a un altro oggetto

JS:

$.ajax({ 
    type: "GET", 
    url: "/Home/GetSomePartialView/", 
    data: someArguments, 
    success: function (viewHTML) { 
     $("#someDiv").html(viewHTML); 
    }, 
    error: function (errorData) { onError(errorData); } 
}); 

controller C#:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments) 
{ 

    return PartialView("_CaseManager"); 
} 

Questa grande opera. Il viewHTML (nella funzione ajax success) viene restituito come una stringa e non posso inserirlo nella pagina senza problemi.

Ora quello che mi piacerebbe fare è restituire non solo la stringa HTML di PartialView, ma anche una sorta di indicatore di stato. Questa è una cosa dei permessi - per esempio, se qualcuno cerca di ottenere una porzione di app a cui non hanno il permesso, voglio restituire un PartialView diverso da quello che hanno richiesto e anche visualizzare un messaggio in una finestra popup che dice loro perché hanno una visione diversa da quella richiesta.

Così - per fare questo, vorrei fare quanto segue:

controller C#:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments) 
{ 
    ReturnArgs r = new ReturnArgs(); 

    bool isAllowed = CheckPermissions(); 

    if (isAllowed) 
    { 
     r.Status = 400; //good status ... proceed normally 
     r.View = PartialView("_CaseManager"); 
    } 
    else 
    { 
     r.Status = 300; //not good ... display permissions pop up 
     r.View = PartialView("_DefaultView"); 
    } 

    return Json(r); 
} 

public class ReturnArgs 
{ 
    public ReturnArgs() 
    { 
    } 

    public int Status { get; set; } 
    public PartialViewResult View { get; set; } 
} 

JS:

$.ajax({ 
    type: "GET", 
    url: "/Home/GetSomePartialView/", 
    data: someArguments, 
    success: function (jsReturnArgs) { 

     if (jsReturnArgs.Status === 300) { //300 is an arbitrary value I just made up right now 
      showPopup("You do not have access to that."); 
     } 

     $("#someDiv").html(jsReturnArgs.View); //the HTML I returned from the controller 
    }, 
    error: function (errorData) { onError(errorData); } 
}); 

Questo SORTA funziona in questo momento. Ottengo un buon oggetto in JavaScript (cosa mi aspetto di vedere), tuttavia non riesco a vedere come ottenere la stringa HTML completa della proprietà jsReturnArgs.View.

In realtà sto solo cercando la stessa stringa che verrebbe restituita se solo restituissi lo PartialView da solo.

(Come ho detto all'inizio, questa è un'applicazione a singola pagina, quindi non posso semplicemente reindirli a un'altra vista).

Grazie in anticipo per qualsiasi aiuto!

risposta

40

Così - utilizzando i seguenti messaggi ho ottenuto questo lavoro:

Partial Views vs. Json (or both)

Render a view as a string

Entrambi stenderlo bene, poi ho cambiato il mio codice al seguente:

C# :

public ActionResult GetSomePartialView(SomeArgumentModel someArguments) 
{ 
    ReturnArgs r = new ReturnArgs(); 

    bool isAllowed = CheckPermissions(); 

    if (isAllowed) 
    { 
     r.Status = 400; //good status ... proceed normally 
     r.ViewString = this.RenderViewToString("_CaseManager"); 
    } 
    else 
    { 
     r.Status = 300; //not good ... display permissions pop up 
     r.ViewString = this.RenderViewToString("_DefaultView"); 
    } 

    return Json(r); 
} 

public class ReturnArgs 
{ 
    public ReturnArgs() 
    { 
    } 

    public int Status { get; set; } 
    public string ViewString { get; set; } 
} 

JS:

6

un modo per passare dover restituire un JSON con più parametri e la vostra html codificati come JSON è quello di inviare un HTML sempre, ma si invia un campo nascosto che ha lo status impostato in esso o qualcosa del genere ..

success: function(data) 
{ 
    if(data.find("#ajax-status").val()==="success") 
    { 
    $("#someDiv").html(data); 
    } 
    else 
    { 
    showPopup("You do not have access to that."); 
    } 
} 

Non consiglierei quest'appraoch avrei due viste parziali una per la vista normale e l'altra per l'errore/caso non autorizzato ..

+0

Apprezzo l'input! Stavo cercando di evitare una cosa del genere se potessi. – MattW

Problemi correlati