动作方法MVC中的多态性

时间:2011-07-10 16:18:50

标签: asp.net-mvc-3 asp.net-mvc-routing

我有两个动作:

//行动1 public FileResult Download(string folder,string fileName){...}

//行动2 public FileResult Download(int id,string fileName){...}

当我尝试下载以下网址时 http://localhost:54630/Downloads/Download/15?fileName=sharedhostinggsg.pdf

发生错误: 控制器类型“DownloadsController”上的当前动作“下载”请求在以下操作方法之间不明确: System.Web.Mvc.FileResult在SextaIgreja.Web.Controllers.DownloadsController类型下载(Int32) System.Web.Mvc.FileResult类型SextaIgreja.Web.Controllers.DownloadsController下载(System.String,System.String)

我该如何制作:

网址:../ Downloads / Download / 15?fileName = sharedhostinggsg.pdf 行动:行动2

网址:../ Downloads?folder = Documentos $ fileName = xxx.docx 行动:行动1

我试图对我的路线施加约束,但没有效果:

routes.MapRoute(
    "Download", // Route name
    "Downloads/Download/{id}", // URL with parameters
    new { controller = "Downloads", action = "Download" },  // Parameter defaults
    new { id = @"\d+" }
    );

在互联网上搜索我找到了几个链接,但我无法理解如何解决我的问题。例如,This找不到RequireRequestValue属性。我不知道它是哪个命名空间。

1 个答案:

答案 0 :(得分:3)

您提到的RequireRequestValue是他们创建的自定义类(来自Example posted),因此您无法在任何Microsoft名称空间中找到它。

您将看到的类继承自ActionMethodSelectorAttribute。此属性类可用于帮助过滤操作,就像AcceptVerbs属性一样。因此,在该链接的示例中,它们返回true或false,具体取决于路由参数中是否指定了值。

因此,根据您发布的示例,创建一个名为RequireRequestValueAttribute的类。然后装饰你的两个下载动作方法,如下所示:

[RequireRequestValue("id")]
public FileResult Download(int id, string fileName) { ... }

[RequireRequestValue("folder")]
public FileResult Download(string folder, string fileName) { ... }