Как обновить основное свойство ViewModel при удалении фотографии с помощью ajax.actionLink?

StackOverflow https://stackoverflow.com/questions/9345123

Вопрос

Моя ситуация такова:

у меня есть это ViewModel:

public class RealtyViewModel
{
     public RealtyViewModel()
     {
          Realty = new Realty();
          Photos = new Collection<File>();
     }

     public Realty Realty { get; set; }

     public Collection<File> Photos { get; set; }
}

Я передаю это RealtyViewModel к моему Edit.cshtml Посмотреть. Внутри редактирования я называю Photos.cshtml частичный вид. Частичный вид фотографий также использует то же самое @model RealtyViewModel.

Теперь внутри Photos.cshtml Частичный просмотр Я делаю запрос Ajax, чтобы удалить фото:

@Ajax.ImageActionLink
(@Url.Content(Model.Photos[i].Path), @Localization.Delete, "640", "480",
"DeletePhoto", new {realtyId = Model.Realty.Id, photoId = Model.Photos[i].Id},
new AjaxOptions()
                 {
                      Confirm = @Localization.DeleteConfirmation,
                      HttpMethod = HttpVerbs.Post.ToString(),
                      OnComplete = string.Format("deletePhotoFromPage('{0}')",
                                                                  Model.Photos[i].Id),
                      OnSuccess = "LoadCycle",
                      UpdateTargetId = "myDiv",
                      InsertionMode = InsertionMode.Replace

                 }, new {data_photoId = Model.Photos[i].Id})

Я запускаю этот код:

[HttpDelete]
public ActionResult DeletePhoto(string realtyId, string photoId)
{
    Realty realty = DocumentSession.Load<Realty>(realtyId);

    realty.Photos.Remove(photoId);

    File photo = DocumentSession.Load<File>(photoId);

    // Deletes the file in the database
    DocumentSession.Advanced.DatabaseCommands.Delete(photoId, null);

    // Deletes the file in the disk
    System.IO.File.Delete(Server.MapPath(photo.Path));

    return new EmptyResult();
}

Проблема в том, что мой текущий realtyViewModel То, что я передал в Edit View, все еще ссылается на фотографии, которые я удалил, используя вызовы AJAX. Затем, когда я пытаюсь сохранить обновленную модель, она сохраняет все снова, удерживая старые ссылки на фотографии, которые я только что удалил.

Как я могу обновить свою модель (удалите удаленные фотографии из [ model.Realty.Photos ]) так что это отражает текущее состояние моего редактирования?

Примечание: теперь это работает, потому что я использую Session объект для хранения идентификаторов удаленных фотографий, но я думаю, что это не так. Должно быть прекрасное решение для этого, которое просто не приходит мне в голову ...

Прекрасным решением будет: после удаления успеха вызов Ajax должен вернуть удаленное идентификатор фотографии, чтобы я мог удалить его из [[ model.Realty.Photos ] Затем, когда я попытался сохранить отредактированную Realty, это будет правильно отражать изменения.

Это было полезно?

Решение

После Обсуждение в чате Кажется, что у вас есть скрытые поля в вашем DOM, которые вам нужно удалить:

@for (int i = 0; i < Model.Realty.Photos.Count(); i++)
{
    @Html.HiddenFor(
        m => m.Realty.Photos[i], 
        new { data_photoid = Model.Realty.Photos[i] }
    )
}

Теперь вы можете получить действие контроллера, вернуть идентификатор фотографии, которую необходимо удалить, например, JSON вместо пустого результата:

[HttpDelete]
public ActionResult DeletePhoto(string realtyId, string photoId)
{
    ... 
    return Json(new { photoId = photoId });
}

и на клиенте:

function deletePhotoFromPage(result) { 
    ...
    $(':hidden[data-photoid="' + result.photoId + '"]').remove(); 
}

а также вы должны использовать OnSuccess вариант вместо OnComplete В ваших параметрах ссылки Ajax:

OnSuccess = "deletePhotoFromPage"

вместо:

OnComplete = string.Format("deletePhotoFromPage('{0}')", Model.Photos[i].Id),

OnComplete может быть вызван даже в случае ошибки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top