2011-12-20 80 views
8

我正在使用ASP .NET MVC 3,我有一個有趣的問題來解決,我希望得到一些建議。是否可以通過Controller方法以編程方式調用Razor Compiler?

我有一個頁面,裏面有一些divs。每個div的內容隨着時間而改變,所以目前我有一個定時器,用於每個div的運行,它向服務器發出一個$ .ajax請求,該請求返回帶有更新的div內容的PartialViewResult。部分視圖相當複雜,並引用其他視圖。

這種方法的問題是它不能很好地擴展。可能每個用戶都有很多這樣的定時器在運行,並且很多用戶都在不斷地碰到服務器。我寧願,因此,讓一個請求到返回,有可能在服務器,多格的內容,因此將是:

div1 { some html } 
div2 { some html } 

...

然後在客戶端上我可以把每個位HTML到頁面上的正確位置。

我以爲我能做的是從服務器返回JSON,但我的問題是 - 我如何獲得HTML?目前,剃鬚刀編譯器將運行並將我的部分視圖cshtml文件轉換爲HTML,但如果我返回JSON,是否可以通過編程方式調用剃鬚刀編譯器?

我在這裏找到了Razor引擎:http://razorengine.codeplex.com/似乎做我想要的東西,但是有可能只用香草ASP NET MVC做到這一點嗎?

或者,考慮到這個問題,有沒有更好的方法可以實現我的目標?

感謝您的幫助!

+1

爲什麼不創建一個Action來返回一個新的PartialView來呈現所有這些PartialViews?這樣引擎就從正確的位置被調用,即視圖。 – StuperUser 2011-12-20 14:34:13

回答

5

創建一個返回的行動AJAX更視圖的特定部分一個新的PartialView呈現所有這些PartialViews。 例如 一個動作:

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

與包含一個觀點:

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

詳情請參閱http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

這種方式有只有一個請求和渲染引擎正在從正確的地方,即視圖調用。

然後結果,您可以搜索各種div並替換客戶端中的html。

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

如果你的頁面的結構允許的話,你應該使用:http://api.jquery.com/load/(如@Jorge說)有一條線,以取代所有的HTML。

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

Thanks StuperUser!花了我幾分鐘的時間來回答你的回答,但這會起到一定的作用 - 我在頁面中設置了一個隱藏div,作爲ajax動作的目標ID,在爲循環操作返回的視圖內部每個需要更新,然後在Javascript中的div將它們移到成功功能的正確位置 – kmp 2011-12-20 15:10:38

+1

優秀。如果用CSS定位的方式不同,你不需要在JS層次結構中移動它們,這樣你就可以加載到一個「活的」非隱藏div,並且它們應該被更新。 – StuperUser 2011-12-20 15:15:44

+1

好點,謝謝! – kmp 2011-12-20 15:20:47

3

您可能有兩個方法 - 一個返回HTML,另一個返回JSON。

或可替換地創建一個ActionResult委託給一個JsonResult if the request is an Ajax request或PartialViewResult否則如:

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

非常感謝您的回答,但我的問題是,我希望它成爲服務器的單個AJAX請求,並返回多個要插入的HTML元素,所以請將其視爲一個HTML blob集合,然後將其放入客戶端在頁面 – kmp 2011-12-20 14:40:25

1

爲什麼你只是讓你阿賈克斯打電話,而不是指望一個JSON對象發送到客戶端的HTML與在你的ActionResult控制器的方法記住,這類型返回查看類型的HTML這樣

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

而且客戶端調用這樣

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

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

您也可以加載局部視圖,並呈現與jquery load它沒有比一個叫

+0

「jquery加載它只不過是一個叫做類型get的Ajax」錯誤的頁面上的正確位置。如果您將數據作爲JavaScript對象傳遞給它,它將使用POST。 ''如果數據是作爲對象提供的,則使用POST方法;否則,假定爲GET。「http://api.jquery.com/load/ – StuperUser 2011-12-20 14:45:16

+0

謝謝,但這就像我目前正在做的 - 我有一個運行在客戶端上的定時器,調用控制器上的一個方法,該方法返回HTML併成功將其放入頁面中。問題是,這意味着對於需要更新的頁面上的每個元素,我需要做一個單獨的AJAX請求 – kmp 2011-12-20 14:46:05

+0

謝謝我不知道這一點。我修改了我的答案 – Jorge 2011-12-20 14:47:15

相關問題