返回View()或PartialView()?怎么决定?

时间:2013-08-08 03:56:16

标签: asp.net-mvc-4

我有一个动作:

public ActionResult GetOrders(int id)
{
  ...
}

当我通过超链接(〜/ Order / GetOrders / 1)访问它时,我希望GetOrder返回整个页面View()

当通过@Html.Action("GetOrders")时,我希望它返回PartialView()作为页面的一部分。


现在我使用Erik Philips的方法解决了这个问题。

public ActionResult GetOrders(int id)
{
    var orders = db.Order.Where(a => a.AdCompanyID == id).ToList();
    ViewBag.AdCompanyName = db.AdCompany.Where(a => a.ID == id).Select(a => a.Name).First().ToString();
    if (ControllerContext.IsChildAction)
    {
        ViewBag.isPartial = true;
        return PartialView(orders);
    }
    ViewBag.isPartial = false;
    return View(orders);
}
@{Html.RenderAction("GetOrders", new { id = Model.ID });}
@Html.ActionLink("Related orders", "GetOrders", new { id = item.ID })
GetOrders.cshtml中的

@if (ViewBag.isPartial == false)
{
    ...
}

生成不同的视图。

Queti M. Porta非常感谢!

2 个答案:

答案 0 :(得分:2)

一种简单的方法是将参数传递给action方法,让它知道你想要如何渲染视图。

public ActionResult GetOrders(int id, bool? isPartial)
{
  return (isPartial.HasValue() && isPartial.Value)
         ? PartialView()
         : View();
}

在上面的示例中,我们传入了isPartial,但是,您也可以使用Request.IsAjaxRequest

检查请求是否通过ajax完成

除此之外,没有太多其他方法可以确定请求的方法。

答案 1 :(得分:2)

您可以使用ControllerContext.IsChildAction

public ActionResult Foo()
{
  if (ControllerContext.IsChildAction)
  {
    return PartialView("GetOrdersPartial", model);
  }
  return View("GetOrders", model);
}

另外,我建议使用Html.RenderAction

每条评论更新

我还提到,根据我自己的经验,我从来没有必要这样做。要么你真的有一个完全不同的视图,要么你不知道PartialView将返回没有布局的视图。