2

ファイルをディレクトリにアップロードしようとしています。次のコードは私のために働いた

コントローラ

[HttpPost]
        public ActionResult Index(HttpPostedFileBase uploadFile)
        {
            //string path = @"C:\Users\thomas\Desktop";

            if (uploadFile != null)
            {
                string filePath = Path.Combine(Server.MapPath("/files"), Path.GetFileName(uploadFile.FileName));
                uploadFile.SaveAs(filePath);
            }

            return RedirectToAction("Index");
        }

HTML ページ

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
<form action="/Post/Index" method="post" enctype="multipart/form-data">
    <label for="uploadFile">Upload file: </label>
    <input name="uploadFile" id="uploadFile" type="file" />
    <input value="uploadFile" type="submit" />
</form>

今、私はメッセージと項目クラスを含むモデルによって作成されたメッセージを作成する関数でこれを実装しようとしています。フォームを送信すると、モデルは savecontroller に渡されますが、パラメーター コントローラーのファイルは null です。

HTML ページ

新しいメッセージを作成

@model GeoCitytroopers.Models.MessageItemModel
@{
    ViewBag.Title = "Create";
}
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Event</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Message.MessagePicture)
        </div>
        <div>
            <label for="uploadFile">Upload file: </label>
            <input name="uploadFile" id="uploadFile" type="file" />
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Message.MessagePicture)
            @Html.ValidationMessageFor(model => model.Message.MessagePicture)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Item.ItemTitle)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Item.ItemTitle)
            @Html.ValidationMessageFor(model => model.Item.ItemTitle)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Item.ItemDescription)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Item.ItemDescription)
            @Html.ValidationMessageFor(model => model.Item.ItemDescription)
        </div>

         <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

コントローラ

[HttpPost]
        public ActionResult Create(HttpPostedFileBase uploadFile, MessageItemModel ViewModel)
        {
            if (ModelState.IsValid)
            {
                Utility ut = new Utility();
                Item viewItem = ViewModel.Item;
                Message viewMessage = ViewModel.Message;

                if (uploadFile != null)
                {
                    string filePath = Path.Combine(Server.MapPath("/files"), Path.GetFileName(uploadFile.FileName));
                    uploadFile.SaveAs(filePath);
                }
                //ADD USER TO ITEM
                viewItem = ut.AddUserToItem(viewItem);

                //ADD ITEM
                viewItem.ItemCreateddate = DateTime.Now;


                //ADD DISTRICT TO ITEM
                viewItem.DistrictID = ut.GetUserDistrict();

                db.Items.Add(viewItem);

                //ADD LINK
                viewMessage.Item = viewItem;
                db.Messages.Add(viewMessage);

                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(ViewModel);
        }

アップロードファイルをコントローラーに渡すにはどうすればよいですか? 前もって感謝します!

4

2 に答える 2

6

enctypeフォームに正しいものを設定するのを忘れました。それなしではファイルをアップロードできません:

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

これでアップロードが機能し、uploadFileパラメーターは null になりません。

于 2013-01-17T21:56:26.733 に答える
2

私の最初の推測では、Html ヘルパーを使用して作成したファイルには、必要な暗号化が含まれていません。

使ってみて

using(@Html.BeginForm("action-name","controller-name", 
                       FormMethod.Post, new { enctype="multipart/form-data"}){

}

action-nameとの適切な値controller-name

于 2013-01-17T21:57:13.160 に答える