2012-05-14 42 views
42

Tôi đang viết một ứng dụng ajax trang đơn với ASP.NET MVC - sử dụng nhiều jQuery. Tôi làm điều gì đó tương tự như sau trong suốt ứng dụng:ASP.NET MVC - Trả về một phần một phần của Ajax cùng với một đối tượng khác

JS:

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

điều khiển C#:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments) 
{ 

    return PartialView("_CaseManager"); 
} 

này hoạt động tuyệt vời. viewHTML (trong hàm ajax success) được trả về dưới dạng chuỗi và tôi có thể đẩy nó trên trang không có vấn đề gì.

Bây giờ, điều tôi muốn làm là trả về không chỉ chuỗi HTML một phần, mà còn một số loại chỉ báo trạng thái. Đây là một điều khoản - ví dụ, nếu ai đó cố gắng để có được một phần của họ ứng dụng mà họ không có quyền, tôi muốn trả về một PartialView khác với họ yêu cầu và cũng hiển thị một tin nhắn trong một cửa sổ popup nói với họ tại sao họ có một View khác với những gì họ yêu cầu.

Vì vậy - để làm điều này, tôi muốn làm như sau:

điều khiển 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); } 
}); 

này sorta làm việc ngay bây giờ. Tôi nhận được một đối tượng tốt trong JavaScript (những gì tôi mong đợi để xem), tuy nhiên tôi không thể xem làm thế nào để có được ở chuỗi HTML đầy đủ của tài sản jsReturnArgs.View.

Tôi thực sự chỉ đang tìm kiếm cùng một chuỗi sẽ được trả lại nếu tôi chỉ trả lại số PartialView một mình.

(Như tôi đã đề cập ở phần đầu, đây là một ứng dụng trang đơn - vì vậy tôi không thể chuyển hướng chúng sang Chế độ xem khác).

Cảm ơn bạn đã giúp đỡ!

Trả lời

40

Vì vậy - bằng cách sử dụng bài viết sau đây tôi đã làm việc này:

Partial Views vs. Json (or both)

Render a view as a string

Cả hai đều đẻ nó ra độc đáo, sau đó tôi đã thay đổi mã của tôi như sau:

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

một cách để bỏ qua việc phải trả lại một json với nhiều thông số và html của bạn được mã hóa như json là gửi một HTML luôn nhưng bạn gửi một lĩnh vực ẩn mà có tư cách đặt trong nó hoặc một cái gì đó như thế ..

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

Tôi không khuyến nghị đánh giá này tôi sẽ có hai chế độ xem một phần cho chế độ xem bình thường và chế độ xem khác cho trường hợp lỗi/trái phép ..

+0

Tôi đánh giá cao đầu vào! Tôi đã cố gắng tránh một cái gì đó như thế nếu tôi có thể. – MattW

Các vấn đề liên quan