2

ファイルをアップロードしたい。私はカミソリでMVC3を使用しています。次のViewModelがあります:

Public Class ImportL2EViewModel
    <Required(AllowEmptyStrings:=False, ErrorMessage:="L2E name required")>
    Public Property Name As String

    Public Property File As HttpPostedFileBase    
End Class

私の見解では、フォームを作成します。

@Using Html.BeginForm("Import", "L2ECreationWizard", FormMethod.Post, New Dictionary(Of String, Object) From {{"enctype", "multipart/form-data"}})
    @<div class="welcome-box acenter"> 
        <div style="display: block; text-align: left; width: 330px; margin: auto;">
            <div class="property">
                @Html.LabelFor(Function(m) m.Name)
                @Html.TextBoxFor(Function(m) m.Name)
            </div> 
            <div class="property">
                @Html.LabelFor(Function(m) m.File)
                @Html.TextBoxFor(Function(m) m.File, New With {.type = "file"})
            </div>            
        </div>
        <div class="actionBar">
            <a class="import fright button" href="#">Import</a>
        </div>
    </div>
End Using

結果の html は次のようになります。

<form method="post" enctype="multipart/form-data" action="/L2ECreationWizard/Import" novalidate="novalidate">
    <div class="welcome-box acenter"> 
        <div style="display: block; text-align: left; width: 330px; margin: auto;">
            <div class="property">
                <label for="Name">Name</label>
                <input type="text" value="" name="Name" id="Name" data-val-required="L2E name required" data-val="true">
            </div> 
            <div class="property">
                <label for="File">File</label>
                <input type="file" value="" name="File" id="File">
            </div>            
        </div>
        <div class="actionBar">
            <a href="#" class="import fright button">Import</a>
        </div>
    </div>
</form>

フォームを次のアクション メソッドに投稿します。

<HttpPost()>
Function Import(vm As ImportL2EViewModel) As ActionResult
    ' Nothing yet
End Function

vm.Name投稿した後、私は記入済みを見ることができますvm.Fileが、 Nothing. Request.Files.Countです0。私は何を間違っていますか?SOで同様の質問を見てきましたが、何もうまくいきませんでした。迷っています...

4

1 に答える 1

2

次のようにメソッドにパラメーターを追加しますHttpPostedFileBase file

<HttpPost()>
Function Import(vm As ImportL2EViewModel, file As HttpPostedFileBase) As ActionResult

Dim fileName = Path.GetFileName(file.FileName)
    Dim physicalPath = Path.Combine(Server.MapPath("~/App_Data"), fileName)

    // The files are not actually saved in this demo
    // file.SaveAs(physicalPath)
    ...
End Function

モデルから HttpPostedFileBase プロパティを削除します。これは Request オブジェクトの一部であるため、モデルに追加することはできません。

複数のファイルを選択できるようにしている場合、これは、アップロードされた各ファイルをループできるようにするために必要なものです

<HttpPost()>
Function Import(vm As ImportL2EViewModel, attachments As IEnumerable(Of HttpPostedFileBase)) As ActionResult

    For Each file As var In attachments
        Dim fileName = Path.GetFileName(file.FileName)
        Dim physicalPath = Path.Combine(Server.MapPath("~/App_Data"), fileName)
        ' The files are not actually saved in this demo
        ' file.SaveAs(physicalPath);
    Next
    ...
End Function
于 2012-05-21T14:32:10.883 に答える