HttpPostedFileBase в Asp.Net MVC 4 с Jasny Bootstrap с существующим изображением, сохраненным в S3

Мне нужно знать, было ли удалено изображение в Jasny Bootstrap. Мое сохранение и удаление кода прекрасно работает. Проблема в том, что если изображение не установлено, bc изображение загрузки файла транслируется только в HttpPostedFileBase, когда оно существует.

Учебный класс:

    [NotMapped]
    public HttpPostedFileBase Image { get; set; }

Редактировать вид:

@using (Html.BeginForm("Edit", "MyObject", FormMethod.Post, new { enctype = "multipart/form-data" })) {
    <div class="field">
        <div class="fileinput @imageClass" data-provides="fileinput" data-name="Image">
        <div class="fileinput-new thumbnail" style="width: 150px; height: 150px;">
        <img src="@MyNamespace.Components.S3Utility.DefaultImageUrl">
     </div>
     <div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 350px; max-height: 350px;">
         <img src="@imageUrl">
     </div>
     <div>
         <span class="btn btn-default btn-file">
             <span class="fileinput-new">Select image</span>
             <span class="fileinput-exists">Change</span>
             <input type="file" name="Image">
         </span>
         <a href="#" class="btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a>
    </div>
}

Сохранить код:

if (data.Image == null) {
    S3Utility.Delete(myObject.Id);
} else {
    S3Utility.Upload(data.Image, myObject.Id);
}

Все это прекрасно работает. Он даже загружает изображение, если оно есть (@imageUrl, которое я устанавливаю).

Проблема в том, что HttpPostedFileBase 'Image' всегда имеет значение null при обновлении.

Есть ли какой-то способ узнать, было ли изображение удалено или установлено? И нужно ли обновлять это значение при установке / удалении изображения в Jasny?

Я видел этот пост

http://www.jasny.net/articles/jasny-bootstrap-file-upload-with-existing-file/

но это не переводило на Asp.Net MVC 4 и HttpPostedFileBase.

1 ответ

Итак, ответ был довольно прост. В объекте я добавил еще одно свойство

[NotMapped]
public bool ExistingImage { get; set; }

В моем редактируемом представлении я добавил скрытое поле для ExistingImage, только если изображение существует

Редактировать вид:

@using (Html.BeginForm("Edit", "MyObject", FormMethod.Post, new { enctype = "multipart/form-data" })) {
    <div class="field">
        <div class="fileinput @imageClass" data-provides="fileinput" data-name="Image">
        <div class="fileinput-new thumbnail" style="width: 150px; height: 150px;">
        <img src="@MyNamespace.Components.S3Utility.DefaultImageUrl">
     </div>
     <div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 350px; max-height: 350px;">
         <img src="@imageUrl">
         // THIS IS THE NEW CODE FOR CHECKING EXISTING IMAGE
         @if (existingImage) {
             <input type="hidden" name="ExistingImage" value="true" />
         }
         // END NEW CODE
     </div>
     <div>
         <span class="btn btn-default btn-file">
             <span class="fileinput-new">Select image</span>
             <span class="fileinput-exists">Change</span>
             <input type="file" name="Image">
         </span>
         <a href="#" class="btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a>
    </div>
}

И затем в сохранении я просто проверяю, является ли это существующее изображение или нет:

if (!data.ExistingImage) {
    if (data.Image == null) {
        S3Utility.Delete(myObject.Id);
    } else {
        S3Utility.Upload(data.Image, myObject.Id);
    }
}

Моя проблема не заключалась в понимании того, как работает раздел.fileinput-существующие. Когда вы удаляете или обновляете изображение, оно фактически удаляет все в этом разделе. Так что, если удалить или обновить get вызывается в Jasny, ExistingImage по умолчанию будет false. В этот момент я просто проверяю, является ли Image пустым (удалено или не существует) или существует (обновлено). Если изображение не существует, это вызывает дополнительное удаление на S3, но это не имеет большого значения (для моих целей).

Другие вопросы по тегам