【问题标题】:Controller Action Methods with different signatures具有不同签名的控制器操作方法
【发布时间】:2011-02-04 07:35:15
【问题描述】:

我正在尝试以 files/id 格式获取我的 URL。我猜我的控制器中应该有两个 Index 方法,一个有参数,一个没有。但我在下面的浏览器中收到此错误消息。

无论如何这里是我的控制器方法:

public ActionResult Index()
{
    return Content("Index ");
}

public ActionResult Index(int id)
{
    File file = fileRepository.GetFile(id);
    if (file == null) return Content("Not Found");
    else return Content(file.FileID.ToString());
}

更新:添加路线完成。感谢杰夫

【问题讨论】:

    标签: c# asp.net-mvc model-view-controller controller asp.net-mvc-routing


    【解决方案1】:

    要使用 files/id URL 格式,请移除无参数的 Index 重载,并首先添加此自定义路由,以便在默认路由之前对其进行评估:

    routes.MapRoute(
            "Files",
            "Files/{id}",
            new { controller = "Files", action = "Index" }      
        );
    

    有关将 URL 映射到控制器方法的基础知识,请参阅 ASP.NET MVC Routing Overview,以及 ScottGu 的出色的 URL Routing 文章,其中有几个非常接近您想要做的示例。

    【讨论】:

    • 成功了。我做了一些关于路由的阅读,一切都变得清晰了。非常感谢。很抱歉,我不会标记您的答案,因为 R0MANARMY 回答了我的问题,尽管它被误导了。如果它保持这种状态会更好。无论如何再次感谢:)
    【解决方案2】:

    你只能overload Actions 如果它们在参数和动词上不同,而不仅仅是参数。在您的情况下,您需要一个带有可为空 ID 参数的操作,如下所示:

    public ActionResult Index(int? id){ 
        if( id.HasValue ){
            File file = fileRepository.GetFile(id.Value);
            if (file == null) return Content("Not Found");
                return Content(file.FileID.ToString());
    
        } else {
            return Content("Index ");
        }
    }
    

    您还应该阅读 Phil Haack 的 How a Method Becomes an Action

    【讨论】:

    • @R0MANARMY 我更新了我的方法,但我得到'无法从 int 转换?到 int' 错误。当我重写书呆子晚餐时,我意识到同样的事情发生了。是 MVC 2.0 的东西吗?无论如何,如果我转换为 int 它仍然无法在 id.HasValue 条件(未找到 url)中工作。有什么想法吗?
    • 不,不工作。网址必须采用 /files?id=2 格式。我想在 SO:questions/2576570 中这样做。是否已经完成了路由?
    • @Narsil:提示:评估路线的顺序是什么(默认路线是在您的路线之前还是之后尝试)?你可以使用这个工具来帮助haacked.com/archive/2008/03/13/url-routing-debugger.aspx
    最近更新 更多