控制器动作重载

9

我刚才尝试在我的一个控制器中重载一个操作时,有点惊讶。

我有

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*/);
}

它起作用了,但我的代码变得有些丑陋!

有任何评论或建议吗?我必须接受控制器上的这个瑕疵吗?

谢谢,

Dave

3个回答

4
您已经发现,您无法以这种方式重载操作。
唯一的方法是,如果它们响应不同的动词,才能拥有多个具有相同名称的操作。
我认为,拥有一个处理两种情况的单个方法是更清晰的解决方案,并允许您将逻辑封装在一个地方,而不是依赖于知道具有相同名称但用于不同目的的多个方法。当然,这是主观的,只是我的意见。
如果您真的想要有单独的方法,您可以将它们命名为不同的名称,以清楚地指示它们的不同目的。例如:
public ActionResult GetAll() 
{ 
    return PartialView(/*return all things*/); 
} 

public ActionResult Get(int id) 
{ 
    return PartialView(/*return 1 thing*/); 
} 

1
在我看来,Dave 说的真的很有道理。比如说,如果我有一个选择器可以选择所有内容或单个记录,我不想为此使用不同的方法,而是像 Dave 在示例中展示的那样,使用一种重载方法。
// MrW

0

我在这里没有看到正确的答案,所以我想发布一个正确的答案。

是的,您可以使用ActionName属性在MVC中重载Action结果。

[ActionName("Get")]  
public ActionResult Get()
{
    return PartialView(/*return all things*/);
}

[ActionName("GetById")]  
public ActionResult Get(int? id)
{
   //code
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接