2013-04-08 7 views
0

У меня есть DIV (tenant-reference-photos), который содержит частичный вид, отображающий фотографии. Рядом с каждой фотографией находится кнопка удаления. Когда он щелкнут, я хочу, чтобы фото было удалено из списка, и только DIV, который будет обновлен Ajax.MVC4 - освежающий частичный вид после удаления объекта с Ajax.ActionLink действует неожиданно

Я использую Ajax.ActionLink для удаления действия:

<div> 
    @Ajax.ActionLink("Delete", "DeleteReference", 
    new { id = photo.ImageId }, 
    new AjaxOptions { InsertionMode = InsertionMode.Replace, HttpMethod = "POST", 
         UpdateTargetId = "tenant-reference-photos" }, 
    new { @class = "btn btn-primary" }) 
</div> 

контроллер действия:

[HttpGet] 
public ActionResult DeleteReference(int id) 
{ 
    return View(refPhotoRepository.Find(id)); 
} 

[HttpPost, ActionName("DeleteReference")] 
public ActionResult DeleteReferenceConfirmed(int id) 
{ 
    try 
    { 
     refPhotoRepository.Delete(id); 
     refPhotoRepository.Save(); 
     return PartialView("_TenantReferencePhotosPartial"); 
    } 
    catch (Exception e) 
    { 
     // handle exception 
    } 
    return View(); 
} 

Когда я нажимаю удалить, пожары действий и запись удаляется из базы данных. Проблема заключается в return PartialView("_TenantReferencePhotosPartial");. Когда действие пытается вернуть частичное, я получаю исключение NullReferenceException в @if (Model.ReferencePhotos.Count == 0).

_TenantReferencePhotosPartials.cshtml

<div> 
@if (Model.ReferencePhotos.Count == 0) 
{ 
    <h3>You haven't uploaded any references! 
     @Ajax.ActionLink("Upload now?", 
      "TenantUploadReference", 
      new AjaxOptions 
      { 
       UpdateTargetId = "tenant-reference-photos", 
       InsertionMode = InsertionMode.Replace, 
       HttpMethod = "GET", 
       LoadingElementId = "ajax-loader" 
      })</h3> 
} 
else 
{ 
    foreach (var photo in Model.ReferencePhotos) 
    { 
    <ul class="thumbnails"> 
     <li class="span8"> 
      <a href="#" class="thumbnail"> 
       <img src="@Url.Action("GetReference", "Tenants", new { id = photo.ImageId })" alt="@photo.Name") /> 
      </a> 
     </li> 
     <li class="span4 btn-group btn-group-vertical"> 
      <a href="#" class="btn btn-primary" id="showEditPhotoModal" role="button" data-toggle="modal">Edit</a> 
      @Ajax.ActionLink("Delete", "DeleteReference", 
     new { id = photo.ImageId }, 
     new AjaxOptions { InsertionMode = InsertionMode.Replace, HttpMethod = "POST", UpdateTargetId = "tenant-reference-photos" }, 
     new { @class = "btn btn-primary" }) 
     </li> 
    </ul> 
    } 
} 
</div> 

Даже если есть несколько фотографий в коллекции и один удаляется, исключение еще выброшены на линии, упомянутой выше. Некоторая помощь будет оценена по достоинству.

+0

где вы определили эту функцию? на той же странице .cshtml или на странице _layout.cshtml. Похоже, он не смог разрешить на странице, на которой вы ссылаетесь. – Typist

+0

Я определил его в файле с именем site.js, когда я смотрю его источник. У меня были некоторые проблемы с jQuery $, которые не определены в частичных, даже если они есть в источнике.Если я разрешу не определенную ошибку, моя функция js на правильном пути обновит DIV? – MattSull

+0

Вы видите исходный код сайта и javascript-файлы jQuery или только ссылки на них в разделе главы или внизу. Как только вы увидите источник этих файлов, вы обнаружите, что обе эти ошибки решены. Сейчас вы обновляете всю страницу с помощью - window.location.reload (true); Чтобы обновить div без обновления страницы, вам просто нужно назначить входящий html div как - («#div_id»). Html (incoming_html); – Typist

ответ

2

Как устранить вышеуказанную ошибку?

У меня были некоторые проблемы с JQuery $ не определено в партиалов даже , хотя там в источнике

Я считаю, что это в связи с вашей проблемой. Когда я сталкиваюсь с этим на частичном представлении, то, что всегда работает для меня, это включить его в script section. Так что на вашем _Layout.cshtml где вы пишете свои скрипты, которые вы можете добавить следующее:

// Do this after you referenced jquery 
@RenderSection("scripts", required: false) 
<script> 
// some script references 
</script> 

Тогда на ваш взгляд, вы делаете это:

@section scripts { 
    $(function() { 
     <script> 
      function onDeleteReferenceSuccess(data, status, xhr) { 
       if (data.error) { /* handle error */ } 
       else { 
        window.location.reload(true); 
       } 
      } 
     </script> 
    }); 
} 

После выше будет решена, как я обновить только DIV? Поскольку вы удалили элемент, я бы предположил, что вы захотите удалить div, который представляет элемент.

Если мое предположение верно, то почему бы не дать ему Id, так что вы можете удалить его впоследствии в вашем else заявления:

else { 
    // instead of this -> window.location.reload(true); 
    $("#id_of_the_div").remove(); 
} 

UPDATE: Обновленного вопрос скидывает свой оригинальный ответ. Но позвольте мне включить обновленный ответ здесь сначала (а затем очистить потом). Поэтому причина, по которой у вас есть нулевая эталонная ошибка, заключается в том, что вы не возвращаете модель:

refPhotoRepository.Delete(id); 
refPhotoRepository.Save(); 
// build the model here and pass it to the partial view 
// this will most probably involve querying your data store again 
var model = goBuildTheModel(); 
return PartialView("_TenantReferencePhotosPartial", model; 
+0

Спасибо за ответ. Я должен был упомянуть в своем вопросе, что из списка может отображаться много фотографий, и рядом с ними есть кнопка удаления (Ajax.ActionLink по запросу), которая принимает значение photo.ImageId как параметр, который должен быть передан в действие контроллера. По этой причине я хотел бы обновить DIV, так что все остальные фотографии будут видны. Так что мне нужно назначить входящий html в DIV в соответствии с комментарием @Typist? – MattSull

+0

В способе удаления RESTful вы не должны возвращать html. Будет выполнено состояние (200 OK). Кроме того, вы не «получаете» ресурсы при удалении, поэтому зачем обновлять весь div? Когда вы ** должны ** обновлять только «строку», которую вы удалили. Это лучший подход к тому, что вы делаете. О, и если ваше намерение состоит в том, чтобы убедиться, что ваш пользователь имеет самый свежий вид, выполните перенаправление или другое GET, а затем обновите свой div от этого GET. –

+0

В моем частичном отображении фотографий я сначала проверяю if (list.count == 0), если это Ajax.ActionLink отображается пользователю, который облегчает загрузку изображений. Причина, по которой я пытаюсь использовать подход RESTful, заключается в том, что после успешного удаления фотографии, когда я перенаправляюсь к действию, которое возвращает часть фотографии, я получаю исключение NullReferenceException в if (list.count == 0). Это даже случается, если в списке есть несколько фотографий, и я нажимаю delete на одном. Все немного запутывают ... – MattSull