操作返回多个视图类型(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);
}

我怎样才能清楚地区分我的行为?应该遵循什么样的惯例来保持它的清洁?这些动作是否应该共存于同一个控制器中?

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

我不太明白你说的"明确区分我的行为"是什么意思。从编译器的角度来看,操作方法之间的区别总是取决于以下两点之一:操作的名称和操作使用的参数。你可以有两个名称相同但参数不同的动作,或者两个名称完全不同但参数相同或不同的动作。从开发人员的角度来看,您可以在前面的列表中添加:返回值。就我个人而言,我可以查看这里的任何操作,并清楚地看到它们基于此在做什么,即返回编码为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, PartialViewResultJsonResult继承。

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