0

我试图弄清楚如何让 dropzone.js 与基于 C# 的 Web 服务一起工作。但是我遇到的问题是,在我选择要上传的文件后遇到 404 错误。

这些是我已经完成的步骤: 在 VS2012 中,我启动了一个空的 MVC4 应用程序。然后我通过 NuGet 添加了 index.html、dropzone.js 和 jquery(不知道 dropzone 是否需要它,只是添加它以保存)。根据dropzone.js网站上的例子,我写了下一段html代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <link href="CSS/FileUploader.css" rel="stylesheet" />
    <script src="Scripts/jquery-2.0.2.min.js"></script>
    <script src="Scripts/DropZone.js"></script>
    <script>

    </script>
    <title>File Uploader test</title>
</head>
<body>
    <form action="/FileUpload/FileUploadController"
          class="dropzone" <!-- this css class contains: background-color: yellow; -->
          id="my-awesome-dropzone"></form>
</body>
</html>

我在 RouteConfig.cs 中向路由配置添加了一个路由,如下所示:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            name: "FileUpload",
            url: "FileUpload/FileUploadController",
            defaults: new 
            { 
                controller = "FileUploadController", 
                action = "FileUpload" 
            }
        );
    }

我的控制器看起来像这样:

public class FileUploadController : Controller
{
    [HttpPost]
    public ActionResult FileUpload(IEnumerable<HttpPostedFileBase> files)
    {
        return null; //Breakpoint here
    }
}

我在“return null”行上放了一个断点,只是为了测试该方法是否被正确调用。当我运行代码并打开 html 页面时,dropzone 控件正常工作。但是当我选择一个文件时,会显示这个错误:HTTP verb POST used to access path '/FileUploadController/FileUpload' is not allowed。我不知道为什么。此外,代码不会在断点处中断,所以我猜该方法没有正确调用。

我在这里做错了什么?

4

1 回答 1

0

最后,我弄清楚我做错了什么。虽然我需要一个例子来弄清楚......没有它,我永远不会弄明白,因为解决方案一开始就没有意义。让我分享解决方案,以防您不知道。

首先,我的控制器类看起来像这样(在某些地方可能有不同的名称)

public class FileUploadController : Controller
{
    [HttpPost]
    public ActionResult UploadFiles(IEnumerable<HttpPostedFileBase> files)
    {
        return Json("All files have been successfully stored."); 
    }
}

并像这样映射到它

        routes.MapRoute(
            "Uploader", 
            "FileUploadController/UploadFiles/", 
            new { controller = "FileUploadController", action = "UploadFiles" } 
        );

在我的第一个意见中,没有错,所有的名字都匹配等等。但是,由于我不知道的原因,当您尝试调用 http://FileUploadController/UploadFiles/ 时,.NET 代码会将“Controller”添加到 url 中的控制器名称部分。因此,它会尝试查找 FileUploadControllerController。但是我没有那个类,所以我收到了我在上一篇文章中提到的错误。一旦我将路线映射调整为

        routes.MapRoute(
            "Uploader", 
            "FileUpload/UploadFiles/", //not sure if removing Controller here is required
            new { controller = "FileUpload", action = "UploadFiles" } 
        );

代码有效,UploadFiles 被调用,我得到了返回的 Json 字符串。为了测试我的理论,我在两个地方都添加了 Controller(当然也在 html 文件中),所以我的类被命名为 FileUploadControllerController 并且它再次工作。

我猜微软试图让我们强制使用正确的名称约定,强制我们在类名的末尾添加 Controller。其他我想不出的原因。

于 2013-07-16T20:37:32.453 回答