2011-12-20 35 views
8

Tôi đang sử dụng ASP .NET MVC 3 và tôi có một vấn đề thú vị để giải quyết rằng tôi hy vọng cho một số lời khuyên về.Có thể gọi Trình biên dịch Dao cạo Lập trình từ một phương thức Bộ điều khiển không?

Tôi có một trang có số lượng div bên trong nó. Các nội dung của mỗi div thay đổi theo thời gian và vì vậy hiện tại tôi có một bộ đếm thời gian cho mỗi div chạy mà làm cho một yêu cầu $ .ajax cho máy chủ mà trả về một PartialViewResult với nội dung cập nhật của div. Chế độ xem một phần khá phức tạp và tham chiếu các chế độ xem khác.

Vấn đề với cách tiếp cận này là nó không quy mô rất tốt. Có thể là mỗi người dùng có rất nhiều bộ tính giờ này và với rất nhiều người dùng, máy chủ liên tục bị tấn công. Tôi thà, do đó, tạo ra một yêu cầu duy nhất đến máy chủ trả về, có khả năng, nhiều Nội dung div vì thế nó sẽ là:

div1 { some html } 
div2 { some html } 

...

Sau đó trên máy khách tôi có thể đặt mỗi chút HTML vào đúng vị trí trên trang.

Tôi nghĩ rằng những gì tôi có thể làm là trả lại JSON từ máy chủ nhưng vấn đề của tôi là - làm cách nào để nhận HTML? Tại thời điểm trình biên dịch dao cạo sẽ chạy và biến các phần cshtml xem một phần của tôi thành HTML nhưng nếu tôi trả về JSON, có thể lập trình gọi trình biên dịch dao cạo không?

Tôi đã tìm thấy Dao cạo ở đây: http://razorengine.codeplex.com/ dường như làm những gì tôi muốn nhưng có thể làm điều đó chỉ với vanilla ASP NET MVC không?

Hoặc, nếu có vấn đề, có cách nào tốt hơn để tôi có thể đạt được mục tiêu của mình không?

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

+1

Tại sao không tạo Hành động trả về một phần xem mới để hiển thị tất cả các phần trong Chế độ xem một phần? Bằng cách đó, động cơ đang được gọi từ đúng nơi, tức là chế độ xem. – StuperUser

Trả lời

5

Tạo một hành động trả về một PartialView mới hiển thị tất cả các PartialView. ví dụ: một hành động:

public PartialViewResult AggregatedAction(args) 
{ 
    return PartialView(); 
} 

với một cái nhìn có chứa:

@Html.Action("IndividualAction1", null) 
@Html.Action("IndividualAction2", null) 
@Html.Action("IndividualAction3", null) 

Xem http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx để biết thêm chi tiết.

Bằng cách đó, chỉ có chỉ một yêu cầu và công cụ hiển thị đang được gọi từ đúng vị trí, tức là chế độ xem.

Sau đó, với kết quả, bạn có thể tìm kiếm các div khác nhau và thay thế html trong ứng dụng khách.

$('div#id1').html('div#id1',$(data)); 
$('div#id2').html('div#id2',$(data)); 

Nếu cấu trúc trang của bạn cho phép nó, bạn nên sử dụng: http://api.jquery.com/load/ (như @Jorge nói) để thay thế tất cả các html với một dòng.

$('div#targetDiv').load('Controller\AggregatedAction', anyData); 
+1

Cảm ơn StuperUser! Đã cho tôi một vài phút để groc câu trả lời của bạn nhưng điều đó sẽ làm việc quyến rũ - Tôi có một div ẩn trong trang mà tôi đặt làm ID mục tiêu cho hành động ajax, bên trong chế độ xem được trả về cho hành động mà tôi lặp lại và đặt mỗi divs cần cập nhật và sau đó trong Javascript di chuyển chúng vào đúng vị trí trong hàm thành công – kmp

+1

Tuyệt vời. Bạn không cần phải di chuyển chúng bằng JS trong đánh dấu trong hệ thống phân cấp nếu chúng được định vị khác nhau theo CSS, vì vậy bạn có thể tải vào div chưa được hiển thị "sống" và chúng sẽ được cập nhật ở vị trí. – StuperUser

+1

Điểm tốt, cảm ơn! – kmp

3

Bạn có thể có hai phương thức - một phương thức trả về HTML và một phương thức khác trả về JSON.

Hoặc cách khác tạo ra một ActionResult rằng các đại biểu đến một JsonResult if the request is an Ajax request, hoặc một PartialViewResult khác ví dụ:

public class AjaxableResult : ActionResult 
{ 

    private readonly JsonResult _jsonResult; 
    private readonly PartialViewResult _partialViewResult; 

    public AjaxableResult(JsonResult jsonResult, PartialViewResult partialViewResult) 
    { 
    _jsonResult = jsonResult; 
    _partialViewResult = _partialViewResult; 
    }  

    public override void ExecuteResult(ControllerContext context) 
    { 
    if (context.HttpContext.Request.IsAjaxRequest()) { 
     _jsonResult.ExecuteResult(context); 
    } 
    else 
    { 
     _partialViewResult.ExecuteResult(context); 
    } 
    } 
} 
+0

Cảm ơn rất nhiều vì đã trả lời, nhưng vấn đề của tôi là tôi muốn nó là một yêu cầu AJAX duy nhất cho máy chủ trả về nhiều phần tử HTML được chèn vào để nghĩ về nó như một tập hợp các đốm màu HTML trên máy khách mà tôi đưa vào đúng nơi trên trang – kmp

1

Tại sao bạn chỉ làm cho bạn ajax gọi và thay vì mong đợi một đối tượng JSON gửi cho khách hàng html với một phương pháp trong điều khiển của bạn của ActionResult nhớ rằng loại hình này trở html của các loại quan điểm như thế này

//this if you want get the html by get 
public ActionResult Foo() 
{ 
    return View(); 
} 

Và khách hàng gọi như

này
$.get('your controller path', parameters to the controler , function callback) 

hoặc

$.ajax({ 
     type: "GET", 
     url: "your controller path", 
     data: parameters to the controler 
     dataType: "html", 
     success: your function 
    }); 

Ngoài ra bạn có thể tải quang cảnh một phần, và đưa ra trong một phần cụ thể của quan điểm của bạn với jquery load mà nó không có gì hơn một ajax gọi

+0

"tải jquery mà nó không nhiều hơn ajax gọi là loại có được" sai. Nếu bạn chuyển dữ liệu vào nó như một đối tượng JavaScript, nó sẽ sử dụng POST. '" Phương thức POST được sử dụng nếu dữ liệu được cung cấp như một đối tượng; ngược lại, GET được giả định. "' Http://api.jquery.com/load/ – StuperUser

+0

Cảm ơn, nhưng điều này giống như những gì tôi hiện đang làm - tôi có một bộ đếm thời gian chạy trên máy khách gọi một phương thức trên bộ điều khiển lấy lại HTML và thành công đặt nó trong trang. Vấn đề là điều này có nghĩa là đối với mỗi phần tử trên trang cần được cập nhật, tôi cần thực hiện một yêu cầu AJAX riêng biệt – kmp

+0

Cảm ơn tôi đã không biết điều đó. Tôi sửa đổi câu trả lời của tôi – Jorge

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