Razorで「Html.BeginForm」を書く方法


133

このように書いた場合:

form action = "Images" method = "post" enctype = "multipart / form-data"

できます。

しかし、「@」が付いたRazorでは機能しません。私は間違いをしましたか?

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                             new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)

    <fieldset>

        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />

    </fieldset>
}

私のコントローラーは次のようになります:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload() 
{
    foreach (string file in Request.Files)
    {
        var uploadedFile = Request.Files[file];
        uploadedFile.SaveAs(Server.MapPath("~/content/pics") + 
                                      Path.GetFileName(uploadedFile.FileName));
    }

    return RedirectToAction ("Upload");
}

アクションは実際には「画像」ですか、それとも「アップロード/アップロード」ですか?
J. Steen

実際には2つのコントローラーがあります。'image'アクションを使用したイメージコントローラーとアップロードアクションを使用したアップロードコントローラー..
kk-dev11

回答:


200

次のコードは正常に動作します。

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                                      new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </fieldset>
}

期待どおりに生成します:

<form action="/Upload/Upload" enctype="multipart/form-data" method="post">    
    <fieldset>
        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </fieldset>
</form>

一方、このコードをifやなどの他のサーバー側構成体のコンテキスト内で記述している場合はforeach、の@前を削除する必要がありusingます。例えば:

@if (SomeCondition)
{
    using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                                      new { enctype = "multipart/form-data" }))
    {
        @Html.ValidationSummary(true)
        <fieldset>
            Select a file <input type="file" name="file" />
            <input type="submit" value="Upload" />
        </fieldset>
    }
}

サーバー側のコードに関する限り、次に進む方法を示します

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file) 
{
    if (file != null && file.ContentLength > 0) 
    {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/content/pics"), fileName);
        file.SaveAs(path);
    }
    return RedirectToAction("Upload");
}

1
ありがとう。質問で更新したコントローラーを見てください。これは、カミソリのコードで作業..ない
KK-dev11

2
@ user1076915、それが機能しないのはどういう意味ですか?もう少し具体的に教えてください。コントローラーアクションがどのように見えるかを示すサンプルコードで回答を更新しました。コントローラーアクションでアップロードされたファイルを取得できない場合は、<form>タグがネストされている(HTMLでは許可されていない)か、通常のフォーム送信をハイジャックしてAJAXリクエストを実行するjavascriptを使用している可能性があります。 tファイルのアップロードを処理します。
Darin Dimitrov

コントローラアクションとかみそり '@using'を使用しましたが、表示されます->説明:HTTP404。探しているリソース(またはその依存関係の1つ)が削除されたか、名前が変更されたか、または一時的にご利用いただけません。次のURLを確認して、スペルが正しいことを確認してください。
kk-dev11

@ user1076915、このエラーメッセージはいつ表示されますか?アップロードフォームをレンダリングする場合、またはフォームを送信する場合 最初のケースでは、次のコードを含むビューをGET提供するUploadアクションがあることを確認してくださいUpload.cshtmlpublic ActionResult Upload() { return View(); }。したがってUploadController、2つのUploadアクションを含むと呼ばれるコントローラがあることを確認してください。1つはフォームを提供するためのもので、もう1つは送信を処理するためのものです。
Darin Dimitrov

2
動作しますが、POSTコンテキストでは、以下を追加することをお勧めします。@ Html.AntiForgeryToken();
フレデリック・デ・レネMirouze
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.