2011-05-17 84 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

相关问题