2012-05-14 11 views
42

Estoy escribiendo una aplicación de una página ajax con ASP.NET MVC, haciendo un uso intensivo de jQuery. Hago algo similar al siguiente a lo largo de la aplicación:ASP.NET MVC - Devolviendo un PartialView a Ajax junto con otro objeto

JS:

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

controlador C#:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments) 
{ 

    return PartialView("_CaseManager"); 
} 

Esto funciona muy bien. El viewHTML (en la función ajax success) se devuelve como una cadena y puedo empujarlo en la página sin problema.

Ahora, lo que me gustaría hacer es devolver no solo la cadena HTML PartialView, sino también algún tipo de indicador de estado. Esto es una cuestión de permisos; por ejemplo, si alguien intenta acceder a una parte de la aplicación a la que no tiene permiso, quiero devolver un PartialView diferente del que pidieron y también mostrar un mensaje en una ventana emergente indicándoles por qué obtuvieron una Vista diferente de la que pidieron.

Por lo tanto - para hacer esto, me gustaría hacer lo siguiente:

controlador 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); } 
}); 

Este SORTA funciona en este momento. Obtengo un buen objeto en JavaScript (lo que espero ver), sin embargo, no puedo ver cómo obtener la cadena HTML completa de la propiedad jsReturnArgs.View.

Realmente estoy buscando la misma cadena que sería devuelta si solo devolviera el PartialView por sí mismo.

(Como mencioné al principio, esta es una aplicación de una sola página, así que no puedo simplemente redirigirlas a otra Vista).

¡Gracias de antemano por cualquier ayuda!

Respuesta

40

Por lo tanto - el uso de los siguientes mensajes Tengo este trabajo:

Partial Views vs. Json (or both)

Render a view as a string

Ambos se ponen a cabo muy bien, luego cambié de código a la siguiente:

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:

$.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.ViewString); //the HTML I returned from the controller 
    }, 
    error: function (errorData) { onError(errorData); } 
}); 
6

una forma de omitir tener que devolver un JSON con múltiples parámetros y su html codificado como JSON es enviar un archivo HTML siempre, pero le envíe un campo oculto que tiene el estado fijado en ella o algo por el estilo ..

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

No recomendaría esta aplicación. Tendría dos vistas parciales, una para la vista normal y otra para el caso de error/no autorizado.

+0

¡Agradezco la entrada! Estaba intentando evitar algo así si pudiera. – MattW

Cuestiones relacionadas