Как обновить основное свойство ViewModel при удалении фотографии с помощью ajax.actionLink?
-
27-10-2019 - |
Вопрос
Моя ситуация такова:
у меня есть это 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
может быть вызван даже в случае ошибки.