重载控制器操作

时间:2010-03-12 15:34:41

标签: c# asp.net-mvc controller action nullable

几分钟前,当我试图在我的一个控制器中重载一个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*/);
}

它有效,但我的代码有点难看!

有任何意见或建议吗?我是否必须在控制器上忍受这种瑕疵?

由于

戴夫

3 个答案:

答案 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
}