几分钟前,当我试图在我的一个控制器中重载一个Action
时,我有点意外我有
public ActionResult Get()
{
return PartialView(/*return all things*/);
}
我添加了
public ActionResult Get(int id)
{
return PartialView(/*return 1 thing*/);
}
....而且突然间都没有工作
我通过使'id'可以为空并解除其他两种方法来解决这个问题
public ActionResult Get(int? id)
{
if (id.HasValue)
return PartialView(/*return 1 thing*/);
else
return PartialView(/*return everything*/);
}
它有效,但我的代码有点难看!
有任何意见或建议吗?我是否必须在控制器上忍受这种瑕疵?
由于
戴夫
答案 0 :(得分:4)
你不能像你发现的那样以这种方式重载动作。
让多个动作具有相同名称的唯一方法是,如果它们响应不同的动词。
我认为使用一种处理这两种情况的方法是一种更清晰的解决方案,并允许您将逻辑封装在一个地方,而不是依赖于知道有多个具有相同名称的方法用于不同目的。 - 当然这是主观的,只是我的意见。
如果你真的想要使用不同的方法,你可以用不同的方法命名它们,以便它们清楚地表明它们的不同目的。 e.g:
public ActionResult GetAll()
{
return PartialView(/*return all things*/);
}
public ActionResult Get(int id)
{
return PartialView(/*return 1 thing*/);
}
答案 1 :(得分:1)
在我看来,你说Dave真的很有道理。例如,如果我有一个选择,可以选择所有内容,或单个记录,我不希望有不同的方法,而是有一个带有重载的方法,如Dave在示例中显示的那样。
// MrW
答案 2 :(得分:0)
我在这里看不到正确的答案,所以我想发一个正确答案。
是的,您可以使用 ActionName 属性重载MVC中的Action结果。
[ActionName("Get")]
public ActionResult Get()
{
return PartialView(/*return all things*/);
}
[ActionName("GetById")]
public ActionResult Get(int? id)
{
//code
}