2012-05-24 2 views
0

У меня возникают проблемы с загрузкой файла (HTTPPostedFile) и объектом, отправленным в действие. У меня есть класс с именем виджета:MVC3 :: Передача объекта и HttpPostedFile в действии

public class Widget 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string FilePath { get; set; } 
} 

и в контроллере виджет У меня есть «Добавить» метод

public ActionResult Add() 
{ 
    return View(); 
} 

и перегруженный метод, чтобы принять то, что посты пользователя назад

[HttpPost] 
public ActionResult Add(Widget widget, HttpPostedFile file) 
{ 
    // Save posted file using a unique 
    // Store the path/unique name in Widget.FilePath 
    // Save new Widget object 
    return View(); 
} 

и на вид У меня есть следующее:

@model Project.Models.Widget 
@{ 
    using(Html.BeginForm()) 
    { 
     Html.LabelFor(model => model.FirstName)<br /> 
     Html.TextBoxFor(model => model.FirstName)<br /> 
     Html.LabelFor(model => model.LastName)<br /> 
     Html.TextBoxFor(model => model.LastName)<br /> 
     <input type="file" id="file" /><br /> 
     <input type="submit" value="Save" /> 
    } 
} 

Что я хочу сделать, так это заполнить форму и выбрать файл для загрузки. После того, как файл загружен, я хочу сохранить файл с помощью уникального имени, а затем сохранить путь к файлу в виде widget.FilePath.

Каждый раз, когда я пытаюсь, объект виджета заполняется, но uploadedFile имеет значение NULL.

Любая помощь была бы принята с благодарностью.

ответ

6

Существует несколько проблем с кодом.

  • Проверьте, пожалуйста, правильность ввода: enctype="multipart/form-data" - в противном случае вы не сможете загружать файлы.
  • Убедитесь, что ваш входной файл имеет атрибут name и что значение этого атрибута соответствует имени вашего аргумента действия. Назначение id не влияет на привязку на стороне сервера.

Например:

@model Project.Models.Widget 
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.LabelFor(model => model.FirstName)<br /> 
    @Html.TextBoxFor(model => model.FirstName)<br /> 
    @Html.LabelFor(model => model.LastName)<br /> 
    @Html.TextBoxFor(model => model.LastName)<br /> 
    <input type="file" id="file" name="file" /><br /> 
    <input type="submit" value="Save" /> 
} 

Также убедитесь, что ваши действия контроллер работает с вместо этого HttpPostedFileBase из HttpPostedFile:

[HttpPost] 
public ActionResult Add(Widget widget, HttpPostedFileBase file) 
{ 
    // Save posted file using a unique 
    // Store the path/unique name in Widget.FilePath 
    // Save new Widget object 
    return View(); 
} 

Также можно объединить 2 параметра в одной модели представления :

public class Widget 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string FilePath { get; set; } 
    public HttpPostedFileBase File { get; set; } 
} 

, а затем:

[HttpPost] 
public ActionResult Add(Widget widget) 
{ 
    // Save posted file using a unique 
    // Store the path/unique name in Widget.FilePath 
    // Save new Widget object 
    return View(); 
} 

Наконец прочитал следующее сообщение в блоге: http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx

+0

HttpPostedFileBase - это был мой вопрос –

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