Добавить комментарий - CodeHelper

Добавить комментарий

Подход, который описал Sergey, подразумевает работу с объектом Request в теле методов контроллера. И, хотя в оригинальной статье приводятся методики тестирования такого кода, сам подход не очень вписывается в концепцию MVC. Предлагаю альтернативное решение.

Во-первых, определяем класс, который будет содержать информацию о загружаемом файле:

public class FileData
{
    public FileData()
    {
    }

    public FileData(string name, long sizeInBytes, Stream inputStream)
    {
        Name = name;
        SizeInBytes = sizeInBytes;
        InputStream = inputStream;
    }

    public string Name { get; private set; }

    public long SizeInBytes { get; private set; }

    public Stream InputStream { get; private set; }
}

Затем пишем ModelBinder, который будет автоматически доставать из объекта Request информацию о файле и создавать соответствующий объект FileData:

public class FileDataModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var filePropertyName = bindingContext.ModelName;
        var file = controllerContext.HttpContext.Request.Files[filePropertyName];
        if (file != null && file.ContentLength > 0)
        {
            return new FileData(file.FileName, file.ContentLength, file.InputStream);
        }

        return null;
    }
}

Регистрируем binder в коде инициализации приложения:

ModelBinders.Binders.Add(typeof(FileData), new FileDataModelBinder());

Вид для загрузки файлов:

<%using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data", @class = "small" }))
  {%>
    <div>
        <label for="FileData">Файл</label>
        <input type="file" id="FileData" name="FileData" />
        <%=Html.ValidationMessage("FileData") %>
    </div>

    <input type="submit" value="Сохранить" />
<%} %>

Теперь, если соответствующий метод контроллера принимает аргумент типа FileData, то этот объект будет создан и заполнен автоматически.

public class FileController 
{
    public ActionResult Upload()
    {
        return View();
    }

    [AcceptPost]
    public ActionResult Upload(FileData fileData)
    {
        // Работаем с объектом fileData
    }
}
Внимание! Вы собираетесь отправить информацию от имени анонимного пользователя.
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.