操作返回多个视图类型(html, json, partials)的约定
本文关键字:json partials 约定 html 返回 视图 类型 操作 | 更新日期: 2023-09-27 18:11:05
我正在ASP中构建一个网站。净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);
}
我怎样才能清楚地区分我的行为?应该遵循什么样的惯例来保持它的清洁?这些动作是否应该共存于同一个控制器中?
我不太明白你说的"明确区分我的行为"是什么意思。从编译器的角度来看,操作方法之间的区别总是取决于以下两点之一:操作的名称和操作使用的参数。你可以有两个名称相同但参数不同的动作,或者两个名称完全不同但参数相同或不同的动作。从开发人员的角度来看,您可以在前面的列表中添加:返回值。就我个人而言,我可以查看这里的任何操作,并清楚地看到它们基于此在做什么,即返回编码为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
,是一个基类,所有的ViewResult
, PartialViewResult
和JsonResult
继承。
ActionResult是一个抽象类,所有其他结果类都是从它派生的。使用派生类名代替所有方法的用户ActionReault。如JsonResult, ViewResult, PartialViewResult