返回多个视图类型的操作约定(html,json,partials)

时间:2014-07-02 15:10:47

标签: c# asp.net-mvc

我正在ASP.NET MVC5中构建一个网站。在我的控制器中,我有一些操作可以返回相同的数据,但格式不同,主要是视图,部分视图和Json。

例如,我会有一个显示项目列表的控制器:

// some action returning a view
public ActionResult List()
{
   var model= _repository.Items.ToViewModel();
   return View(model)
}

// some action returning a partial view
[ChildActionOnly]
public ActionResult ListPartial()
{
   var model= _repository.Items.ToViewModel();
   return PartialView("_ListPartial", model)
}

// some action returning JSON
public ActionResult GetList()
{
   var model= _repository.Items.ToViewModel();
   return Json(model, JsonRequestBehavior.AllowGet);
}

如何明确区分我的行为? 应该遵循什么样的惯例来保持清洁? 这些行为应该在同一个控制器中共存吗?

2 个答案:

答案 0 :(得分:2)

ActionResult是一个抽象类,所有其他结果类都是从它派生的。 而不是用户ActionReault为所有方法使用派生类名。像JsonResult,ViewResult,PartialViewResult

答案 1 :(得分:2)

我不确定你的意思"明确区分我的行为"。从编译器的角度来看,操作方法之间的区别总是取决于两个方面之一:操作的名称和操作所采用的参数。因此,您可以使用相同名称但不同参数的两个操作,或者具有完全不同名称和相同或不同参数的两个操作。从开发人员的角度来看,您可以添加到上一个列表:返回值。就个人而言,我可以看看你在这里所做的任何行动,并清楚地看到他们在此基础上做了什么,即返回编码为JSON的模型,显然是一个JSON结果。

就保持清洁而言,这又是一个有点负担的问题。什么定义"清洁"?你的方法看起来很完美"清洁"就像我一样。您已经有一些代码重复,但我认为在这种情况下可以接受。您所做的只是检索每个模型。有人可能会争论留下这样的重复代码,因为可能每种方法都会随着时间的推移而分散,检索该模型的更多或更少部分或包括其他相关实体等。

但是,如果要删除代码重复,可以将该行分解为控制器上的内部方法,然后让每个操作调用该内部方法。这样,如果您需要修改该行,您只需要在一个地方进行修改,但当然,如果您只需要针对其中一个操作进行修改,那么您将回到原来的位置。

现在,如果动作在同一个控制器中共存,这也有点主观。因为,它们在功能上具有如此密切的关联,只有不同的返回值,因此将它们保存在同一个控制器中是一个简单的参数。但是,建议将它们移动到不同的控制器中同样有效,例如,您将所有JSON返回操作放在一起。其中很多归结为个人偏好。

现在,所有这一切,在这一个特定场景中,由于字面上唯一的区别是返回值取决于用于获取操作的方法,您实际上可以将所有这些组合成一个操作:

public ActionResult List()
{
   var model= _repository.Items.ToViewModel();

   if (Request.IsAjaxRequest())
   {
       return Json(model, JsonRequestBehavior.AllowGet);
   }

   if (ControllerContext.IsChildAction)
   {
       return PartialView("_ListPartial", model);
   }

   return View(model);
}

这是可能的,因为您的操作的返回值ActionResult是一个基类,所有ViewResultPartialViewResultJsonResult都会继承。< / p>