0

dropzone.js を C# ベースの Web サービスで動作させる方法を理解しようとしています。しかし、アップロードするファイルを選択した後に 404 エラーが発生するという問題が発生しました。

これらは私が行った手順です: VS2012 では、空の MVC4 アプリケーションを開始しました。次に、NuGet を介して index.html、dropzone.js、および jquery を追加しました (dropzone が必要かどうかはわかりません。保存するために追加しただけです)。dropzone.js の Web サイトの例に基づいて、次の 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 コントロールが正しく機能します。しかし、ファイルを選択すると、次のエラーが表示されます。パス '/FileUploadController/FileUpload' にアクセスするために使用される HTTP 動詞 POST は許可されていません。理由がわかりません。また、ブレークポイントでコードが壊れないので、メソッドが正しく呼び出されていないと思います。

ここで何が間違っていますか?

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 コードによって、URL のコントローラー名の部分に「Controller」が追加されます。そのため、FileUploadControllerController を検索しようとします。しかし、私はそのクラスを持っていないので、以前の投稿で述べたエラーが発生します。ルートマッピングを適応させるとすぐに

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

コードが機能し、UploadFiles が呼び出され、Json 文字列が返されます。私の理論をテストするために、コントローラーを両方の場所に (そしてもちろん html ファイルにも) 追加したので、私のクラスは FileUploadControllerController という名前になり、再び機能します。

Microsoft は正しい命名規則を強制しようとして、クラス名の最後に Controller を追加するように強制したと思います。私が考えられない他の理由。

于 2013-07-16T20:37:32.453 に答える