2011-05-17 81 views
1

如何在一次調用特定控制器的情況下呈現多個不同的動作? Html.RenderAction()/Html.Action()只處理一個控制器&的操作。 但是如果我想在一次調用中在屏幕上顯示不同的視圖呢?如何在一次調用中呈現多個動作?

在此先感謝, Sagiv

編輯:再次 你好。
我不確定你是否理解我的問題。 這是CSHTML:

<div id="menu">@using (Ajax.ActionLink("click me", "SomeAction","SomeController", new AjaxOptions() { HttpMethod = "POST", OnSuccess = "showMsg", OnFailure = "showError" }))</div> 
    <div id="div1">bla bla content</div> 
.... 
    <div id="div2">bla bla content</div> 

,這是控制器:

public class SomeController : Controller 
    { 
     public ActionResult SomeAction() 
     {   
      return View("somethingfordiv1", ModelForDiv1); 
      return View("somethingfordiv2", ModelForDiv2); //i want also return another view here 
     } 
    } 
在控制器上此Ajax調用

,我要回了2周不同的div 2點不同的看法。
再次感謝:)

+0

爲什麼不回到一個模型都div的? – CRice 2011-05-18 04:03:57

+0

,因爲它們位於頁面上的不同部分。我不想刷新整個頁面(這就是爲什麼它是一個Ajax調用)。另外,每個部分都有自己的顯示邏輯。我只是想在一個電話中,我會在同一頁上呈現2個不同的部分。 – 2011-05-18 04:22:36

+1

爲什麼你不能做兩個動作和兩個Ajax調用? – frennky 2011-05-18 07:33:43

回答

2

這裏你可以進行的一種方式。您可以將兩個視圖模型聚合到一個獨特的視圖模型中,然後讓控制器操作返回一個包含javascript的視圖,這會將兩個視圖結果注入到不同的div中。

由於總是與視圖模型開始:

public class Model1 { } 
public class Model2 { } 

public class AggregatedModel 
{ 
    public Model1 Model1 { get; set; } 
    public Model2 Model2 { get; set; } 
} 

然後控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult SomeAction() 
    { 
     var model = new AggregatedModel 
     { 
      Model1 = new Model1(), 
      Model2 = new Model2() 
     }; 
     Response.ContentType = "text/javascript"; 
     return PartialView(model); 
    } 
} 

然後相應~/Views/Home/Index.cshtml視圖:

<div id="menu"> 
    @Html.ActionLink("click me", "SomeAction", "Home", new { id = "clickme" }) 
</div> 

<div id="div1">bla bla content</div> 
<div id="div2">bla bla content</div> 

<script type="text/javascript"> 
    $('#clickme').click(function() { 
     $.getScript(this.href); 
     return false; 
    }); 
</script> 

下一步~/Views/Home/SomeAction.cshtml視圖:

@model AggregatedModel 
$('#div1').html(@Html.Raw(Json.Encode(Html.Partial("Model1", Model.Model1).ToHtmlString()))); 
$('#div2').html(@Html.Raw(Json.Encode(Html.Partial("Model2", Model.Model2).ToHtmlString()))); 

最後兩個~/Views/Home/Model1.cshtml~/Views/Home/Model2.cshtml觀點:

@model Model1 
<span>This is the contents for model1</span> 

和:

@model Model2 
<span>This is the contents for model2</span> 
+1

這是個好主意。太糟糕了微軟沒有爲多個視圖渲染選項。 Html.Action()只能渲染一個視圖。與Ajax.ActionLink()相同。 – 2011-05-18 16:40:22

0

如果要在屏幕上呈現不同的視圖返回一個表示這些視圖的數據的模型,那麼您可以使用RenderPartial並將所需模型數據的部分傳遞給每個視圖。

你也可以使用viewdata分別有這個可用。

Html.RenderAction也可以,但模擬另一個完整的請求


爲了您的Ajax請求你可以從一個局部視圖的渲染返回一個HTML塊,這可以通過Request.IsAjaxRequest確定。然後你的javascript可以將結果設置到文檔中。

這是你的行動

if (Request.IsAjaxRequest()) 
{ 
    return View("PartialViewName", partialModel); 
} 
return View("NormalView", normalModel); 

和客戶端爲例(使用jQuery)

function hijack(form) { 
     $("div#SearchResults").html(""); 
     $("div#SearchResults").addClass('loading'); 

     $.ajax({ 
      url: form.action, 
      type: form.method, 
      dataType: "html", 
      data: $(form).serialize(), 
      success: function(data) { 
       $("div#SearchResults").removeClass('loading'); 
       $("div#SearchResults").html(data); 
      } 
     }); 
    } 
+0

嗨,感謝您的快速回答。我正在使用ajax calll(讓我們從左側菜單中說),所以當我點擊菜單我想渲染2個不同的視圖(容器)與新的控件取決於點擊什麼。我正在使用Ajax.ActionLink。所以我如何呈現2個不同的視圖(來自2個不同的控制器)呢? – 2011-05-17 23:27:01

+0

已更新答案 – CRice 2011-05-18 00:08:51

相關問題