1

ASP.Net MVC 4 でアプリを開発していて、フォームに画像をアップロードしようとしています。私が抱えている問題は、フォーム<input type="file"...が空の場合 (ファイルを選択していないことを意味します)、フォームが投稿されたときにフォームが正常に投稿され、すべてが機能することです。ただし、ファイルを選択すると、フォームはそこに座って何もしません。

最初は、アップロードに時間がかかるだけだと思っていましたが、かなり長い間放置していました (ファイルサイズは 7kb) 何もありませんでした。デバッガーは、アクションの開始時にブレークポイントにもヒットしません。私はプラットフォームにまったく慣れておらず、毎日学んでいるので途方に暮れています。以下に、関連するすべてのコードを見つけてください。

景色:

 @using (Html.BeginForm("StaffInformation", "Manager", FormMethod.Post, new { @class = "form-horizontal", enctype = "multipart/form-data"}))
            {
                @Html.AntiForgeryToken()
                @Html.ValidationSummary(true)
                <div class="control-group">
                    @Html.LabelFor(model => model.firstName, new { @class = "control-label" })
                    <div class="controls">
                        @Html.TextBoxFor(model => model.firstName, new { @class = "span12" })
                        @Html.ValidationMessageFor(model => model.firstName)
                    </div>
                </div>

                <div class="control-group">
                    @Html.LabelFor(model => model.lastName, new { @class = "control-label" })
                    <div class="controls">
                        @Html.TextBoxFor(model => model.lastName, new { @class = "span12" })
                        @Html.ValidationMessageFor(model => model.lastName)
                    </div>
                </div>

                <div class="control-group">
                    Staff Photo:
                    <div class="controls">
                        @if (Model.staffImage == null)
                        {
                            @:None
                        }else{
                        <img width="150" height="150" src="@Url.Action("GetImage", "Manager", new { Model.staffProfileID })" /><br />
                        }
                        <input type="file" id="staffImage" name="staffImage" data-provide="fileinput">
                    </div>
                </div>

                <div class="form-actions">
                    <button type="submit" class="btn btn-primary">Save changes</button>
                    <a href="@Url.Action("dashboard", "manager")" class="btn" type="reset" >Cancel</a>
                </div>
            }

アクション:

    public ActionResult StaffInformation(StaffInformationViewModel model, HttpPostedFileBase staffImage)
    {
    if (ModelState.IsValid)   //This is where the breakpoint is
        {
            if (staffImage != null) {
                model.imageMimeType = staffImage.ContentType;
                model.staffImage = new byte[staffImage.ContentLength];
                staffImage.InputStream.Read(model.staffImage, 0, staffImage.ContentLength);
            }

            using (var repo = new CompanyInformationRepository(new UniteOfWorkCompanies()))
            {
                var company = repo.FindCompany(User.Identity.Name);

                repo.AddOrUpdateStaff(model, company);
            }

            return RedirectToAction("ManageStaff");
        }
    }

何が起こっているのか本当にわかりませんenctype = "multipart/form-data".Adam Freemanによる「Pro ASP.NET MVC 4」を読んでいて、それなしでは動作しないと彼らが言ったからです。私が言ったように、私はまったく新しいので、私が得ることができるすべての助けが必要です.

4

1 に答える 1

2

HttpPostedFileBase staffImageViewModel ( ) の一部として配置することもできます。また、フォーム タグ内StaffInformationViewModelに保持する必要があります。enctype = "multipart/form-data"

public class StaffInformationViewModel
{
    // your other properties here ...

    [Required]
    public HttpPostedFileBase StaffImage { get; set; }
}

次に、ビューで:

@Html.TextBoxFor(model => model.StaffImage, new { type = "file" })

次に、コントローラーで:

    public ActionResult StaffInformation(StaffInformationViewModel model)
    {
        if (ModelState.IsValid)
        {
            if (model.StaffImage != null)
            {
                // awesome
            }
            // ... more awesome
        }
    }

これが役立つことを願っています。これについてさらに説明が必要な場合はお知らせください...

于 2013-03-18T02:55:35.213 に答える