2012-05-21 3 views
2

Я хочу загрузить файл. Я использую MVC3 с бритвой. У меня есть следующий ViewModel:Загрузка файла с MVC3

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 is Nothing. Request.Files.Count есть 0. Что я делаю не так? Я видел подобные вопросы на SO, но ничего не работало для меня. Я теряюсь ...

ответ

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 
+0

я сделал именно так, как вы сказали, и 'file' еще' Ничего '. Также 'Request.Files' остается пустым ... Любая идея, почему это происходит? Я использовал fiddler, и я не вижу, чтобы файл передавался ... –

+0

Хорошо. Я знаю, что происходит. Я использовал javascript ajax-вызов, чтобы опубликовать форму, и я забыл об этом. Вам нужно сделать некоторые трюки, если вы хотите опубликовать файл с помощью ajax. Урок выучен. Я принимаю ваш ответ, потому что он заверил меня, что мой код в порядке, и что-то еще должно вызывать неожиданное поведение. –

Смежные вопросы