我正在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);
}
如何明确区分我的行为? 应该遵循什么样的惯例来保持清洁? 这些行为应该在同一个控制器中共存吗?
答案 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
是一个基类,所有ViewResult
,PartialViewResult
和JsonResult
都会继承。< / p>