0

私はこの記事に基づいてソリューションを作成しています。 http://dotnetslackers.com/articles/aspnet/ASP-NET-MVC-and-File-Uploads.aspx

ただし、画像をアップロードしようとすると、ファイル名ではなくnullが表示されます。

私の見解は次のようになります。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SHP.Models.HrViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Edit Employee
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <fieldset>
    <legend>Add details to the selected employee</legend>
    <p>The photo you select for an employee will appear on MNet.</p>
    <p>The qualifications you add for an employee will appear on their business cards when required.</p>
        <% using (Html.BeginForm("EditEmployee", "HumanResources", FormMethod.Post,
         new{enctype = "multipart/form-data"}))
           {%>
        <%: Html.AntiForgeryToken() %>
        <%: Html.ValidationSummary(true) %>
        <%: Html.EditorFor(model => model.EmployeeSelector) %>
        <% if (Model.SelectedEmployee != null)
           { %>
                <%: Html.HiddenFor(model => model.SelectedEmployee.EmployeeId) %>
                <%: Html.HiddenFor(model => model.EmployeeName) %>
                <table class="groupBorder" style="margin-top:15px; width:617px;">
                <tbody>
                <tr>
                    <th colspan="2">Add Details for <%: Model.EmployeeName %></th>
                </tr>
                <tr>
                    <td style="text-align: right;">
                <%: Html.LabelFor(model => model.SelectedEmployee.Photo)%>
                   </td>                    
                    <td>
                        <input type="file" id="Picture" name="Picture" />
                    </td>
                </tr>
                <tr>
                    <td style="text-align: right;">
                <%: Html.LabelFor(model => model.SelectedEmployee.Qualifications)%>
                   </td>                    
                    <td>
                <%: Html.TextBoxFor(model => model.SelectedEmployee.Qualifications, new {style = "width:500px;"})%>
                    </td>
                </tr>
                <tr>
                    <td colspan="2" style="text-align: center;padding-top:20px;">
                    <input type="submit" value="Save" id="btnSubmit" /></td>
                </tr>
                </table>
       <% } %>
        <% } %>
        </fieldset>
</asp:Content>

[保存]ボタンをクリックすると、このコントローラーアクションに移動します。

    [HttpPost]
    [Authorize(Roles = "Administrator, HumanResources, ManagerAccounts, ManagerIT")]
    [ValidateAntiForgeryToken]
    [ValidateOnlyIncomingValues]
    public ActionResult EditEmployee(HrViewModel hrvm)
    {
        if (ModelState.IsValid)
        {
            if (hrvm.SelectedEmployee == null
                || hrvm.EmployeeSelector.SearchTextId != hrvm.SelectedEmployee.EmployeeId)
            {
                return this.RedirectToAction(
                    "EditEmployee", new { employeeId = hrvm.EmployeeSelector.SearchTextId });
            }

            if (hrvm.SelectedEmployee.Picture.HasFile())
            {
                var destinationFolder = Server.MapPath("/Users");
                var postedFile = hrvm.SelectedEmployee.Picture;
                var fileName = Path.GetFileName(postedFile.FileName);
                var path = Path.Combine(destinationFolder, fileName);
                postedFile.SaveAs(path);
                hrvm.SelectedEmployee.Photo = path;
            }   

            var emp = Employee.GetEmployee(hrvm.SelectedEmployee.EmployeeId);
            this.TryUpdateModel<IEmployeeHrBindable>(emp, "SelectedEmployee");
            emp.Update();
            this.TempData["Message"] = string.Format(
                "At {0} Details updated for {1}", DateTime.Now.ToString("T"), hrvm.EmployeeName);
            return this.View(hrvm);
        }

        return this.View(new HrViewModel());
    }

だから私は何が間違っているのですか?

4

2 に答える 2

1

デフォルトでは、MVC3はビューの入力要素のName属性に基づいてモデルバインディングを実行します。

ファイルアップロードデータを取得するには、ActionResultのパラメーターとしてHttpPostedFileBaseクラスを使用し、パラメーター'file'を呼び出します。

[HttpPost]
[Authorize(Roles = "Administrator, HumanResources, ManagerAccounts, ManagerIT")]
[ValidateAntiForgeryToken]
[ValidateOnlyIncomingValues]
public ActionResult EditEmployee(HrViewModel hrvm, HttpPostedFileBase file)
{
    if (ModelState.IsValid)
    {
        if (hrvm.SelectedEmployee == null
            || hrvm.EmployeeSelector.SearchTextId != hrvm.SelectedEmployee.EmployeeId)
        {
            return this.RedirectToAction(
                "EditEmployee", new { employeeId = hrvm.EmployeeSelector.SearchTextId });
        }
        if (file.ContentLength > 0)
        {
            hrvm.SelectedEmployee.Picture = file;
            var destinationFolder = Server.MapPath("/Users");
            var postedFile = hrvm.SelectedEmployee.Picture;
            var fileName = Path.GetFileName(postedFile.FileName);
            var path = Path.Combine(destinationFolder, fileName);
            postedFile.SaveAs(path);
            hrvm.SelectedEmployee.Photo = path;
        }   

        var emp = Employee.GetEmployee(hrvm.SelectedEmployee.EmployeeId);
        this.TryUpdateModel<IEmployeeHrBindable>(emp, "SelectedEmployee");
        emp.Update();
        this.TempData["Message"] = string.Format(
            "At {0} Details updated for {1}", DateTime.Now.ToString("T"), hrvm.EmployeeName);
        return this.View(hrvm);
    }

    return this.View(new HrViewModel());
}

(したがって、モデルバインディングを使用して画像データを取得できる場合は、hrvm.SelectedEmployee.Pictureではなくhrvm.Pictureに配置されます)

于 2012-09-13T16:05:26.223 に答える
1

ビューでは、代わりに次を使用すると、デフォルトのモデルバインディングが機能するはずです。

<%: Html.TextBoxFor(model => model.SelectedEmployee.Photo, new { type = "file" }) %>

SelectedEmployee.Photoこれは、がタイプであると想定していHttpPostedFileBaseます。

現時点で機能していない理由は、デフォルトのモデルバインダーが、ファイル入力の名前であるPictureというプロパティをモデル上で直接検索しようとするためです。PictureはSelectedEmployeeのプロパティであるため、見つかりません。

上記で提案したものに変更すると、マークアップに入力されたファイルの正しいIDと名前が生成されるため、ポストバックされたときに正しいパスが使用されます。これは、デフォルトのモデルバインダーがフォームの投稿値とプロパティの間でマッピングできることを意味します。

于 2012-09-13T16:47:47.793 に答える