如何在一次通话中呈现多个动作?

时间:2011-05-17 23:17:22

标签: c# asp.net-mvc asp.net-mvc-3 razor

如何在一次调用特定控制器时呈现多个不同的动作? 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个不同的视图 再次感谢:)

2 个答案:

答案 0 :(得分: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 :(得分: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);
            }
        });
    }