MVC ASP.NET отправил привязку модели файла, когда параметр является Моделью

Веб-хранилище HTML предоставляет два объекта для хранения данных на клиенте:

window.localStorage - stores data with no expiration date 
window.sessionStorage - stores data for one session (data is lost when 
the browser tab is closed)

LocalStorage:

Веб-хранилище можно рассматривать упрощенно как улучшение для файлов cookie, обеспечивая гораздо большую вместимость склада. Доступный размер составляет 5 МБ, что значительно больше пространства для работы, чем обычный файл cookie 4 КБ.

Данные не отправляются обратно на сервер для каждого HTTP-запроса (HTML, изображения, JavaScript, CSS и т. Д.) - сокращение количество трафика между клиентом и сервером.

Данные, хранящиеся в localStorage, сохраняются до явного удаления. Сделанные изменения сохраняются и доступны для всех текущих и будущих посещений сайта. Он работает по политике одного и того же происхождения. Таким образом, сохраненные данные будут доступны только в одном и том же источнике.

Объект localStorage:

Объект localStorage хранит данные без даты истечения срока действия. Данные не будут удалены, если браузер закрыт и будет доступен следующий день, неделю или год.

// Store
 localStorage.setItem("lastname", "Smith");

// Retrieve

localStorage.getItem("lastname");

//Remove

localStorage.removeItem("lastname");

Файлы cookie:

Мы можем установить время истечения для каждый файл cookie. Ограничение 4K для всего файла cookie, включая имя, значение, дату истечения срока годности и т. д. Чтобы поддерживать большинство браузеров, держите имя менее 4000 байт и общий размер файла cookie под 4093 байтами.

Данные отправляется обратно на сервер для каждого HTTP-запроса (HTML, изображения, JavaScript, CSS и т. д.) - увеличение количества трафика между клиентом и сервером.

sessionStorage:

аналогично localStorage. Изменения доступны только для каждого окна (или вкладки в браузерах, таких как Chrome и Firefox). Сделанные изменения сохраняются и доступны для текущей страницы, а также для будущих посещений сайта в том же окне. Когда окно закрыто, хранилище удаляется

Данные доступны только внутри окна / вкладки, в котором он был установлен.

Данные не являются постоянными, т. Е. Будут потеряны после закрытия окна / вкладки. Подобно localStorage, он работает с политикой того же происхождения. Таким образом, сохраненные данные будут доступны только в одном и том же источнике.

24
задан bzlm 7 June 2009 в 14:19
поделиться

4 ответа

Оказывается, причина в том, что ValueProviderDictionary просматривает только Request.Form , RouteData и Request. QueryString для заполнения словаря поставщика значений в контексте привязки модели. Таким образом, у настраиваемого связывателя модели нет возможности разрешить опубликованным файлам участвовать в привязке модели без непосредственной проверки коллекции файлов в контексте запроса. Я нашел наиболее близкий способ сделать то же самое:

public ActionResult Create(MyModel myModel, HttpPostedFileBase myModelFile) { }

Пока myModelFile на самом деле является именем поля формы ввода файла , нет необходимости в каких-либо нестандартные вещи.

30
ответ дан 28 November 2019 в 23:55
поделиться

Вы просматривали этот пост , на который он ссылается из того, на который вы ссылались (через еще один ...)?

Если нет, то выглядит довольно просто. Это модель связующего он использует:

public class HttpPostedFileBaseModelBinder : IModelBinder {
    public ModelBinderResult BindModel(ModelBindingContext bindingContext) {
        HttpPostedFileBase theFile =
            bindingContext.HttpContext.Request.Files[bindingContext.ModelName];
        return new ModelBinderResult(theFile);
    }
}

Он регистрирует его в Global.asax.cs следующим образом:

ModelBinders.Binders[typeof(HttpPostedFileBase)] = 
    new HttpPostedFileBaseModelBinder();

и сообщения с формой, которая выглядит следующим образом:

<form action="/File/UploadAFile" enctype="multipart/form-data" method="post">
    Choose file: <input type="file" name="theFile" />
    <input type="submit" />
</form>

Весь код копируется прямо с поста блога ...

6
ответ дан Tomas Aschan 28 November 2019 в 23:55
поделиться

. Вам не нужно регистрировать настраиваемый связыватель, HttpPostedFileBase по умолчанию зарегистрирован в платформе :

public ActionResult Create(HttpPostedFileBase myFile)
{
    ...
}

Полезно читать книгу время от времени, вместо того, чтобы полагаться исключительно на блоги и веб-форумы.

-16
ответ дан 28 November 2019 в 23:55
поделиться

Другой способ - добавить скрытое поле с тем же именем, что и вход:

<input type="hidden" name="MyFile" id="MyFileSubmitPlaceHolder" />

DefaultModelBinder затем увидит поле и создаст правильную привязку.

14
ответ дан 28 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: