Как инициализировать частичное представление, чтобы при получении другой информации PartialViewResult содержал новую информацию? - PullRequest
0 голосов
/ 12 марта 2012

У меня есть следующий сценарий:

У меня есть строго типизированное частичное представление, которое отображает информацию для модели представления с именем PlaceVieWModel, которая отображается внутри строго типизированного представления для MainPlaceViewModel.

Классы:

public class PlaceViewModel
{
    public int PlaceID { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public decimal Latitude { get; set; }
    public decimal Longitude { get; set; }
    public bool HasLiveMusic { get; set; }
}

public class MainPlaceViewModel
{
    public string Name { get; set; }
    public string Description { get; set; }
    public List<PlaceViewModel> Places { get; set; }
    public string WebPage { get; set; }
    public string LogoRoute { get; set; }
    public string LogoDetailCssClass { get; set; }
}

В представлении MainPlaceModelView я генерирую Ajax.ActionLink для каждого из MainPlaceViewModel.Places, который получает информацию для этого Места и отображает ее в частичном представлении, это код для этого:

@foreach (var item in Model.Places)
{                 
     @Ajax.ActionLink(item.Name, "", "", new AjaxOptions { Url = Url.Action("GetPlaceInfo", "MainPlaces", new { placeId = item.PlaceID }), HttpMethod = "GET", UpdateTargetId = "placeInfo", InsertionMode = InsertionMode.Replace, LoadingElementId = "loading" })                                              
 }

Это действие:

public PartialViewResult GetPlaceInfo(int placeID)
{
     var place = _db.Places.SingleOrDefault(p => p.PlaceID == placeID);

     PlaceViewModel placeViewModel = new PlaceViewModel();

     placeViewModel.Address = place.Address;
     placeViewModel.HasLiveMusic = place.HasLiveMusic;
     placeViewModel.Latitude = place.Latitude;
     placeViewModel.Longitude = place.Longitude;
     placeViewModel.Name = place.Name;
     placeViewModel.PlaceID = place.PlaceID;

     return PartialView("_PlaceInfo", placeViewModel);
  }

Моя проблема в том, как мне инициализировать @ Html.Partial, если я делаю это так:

<div id="loading" style="display:none;">
     Loading...
</div>
<div id="palceInfo">
     @Html.Partial("_PlaceInfo", Model.Places.FirstOrDefault())
</div>

Частичное представление всегда показывает первый элемент независимо от того, какой Ajax.ActionLink нажат.

Есть идеи о том, как его инициализировать, чтобы он также работал при нажатии любой из ссылок ActionLink?

ОБНОВЛЕНИЕ: Проблема была в опечатке в моем целевом div, идентификатор был "palceInfo", и я устанавливаю ссылку действия для обновления "placeInfo", я не могу поверить, что потерял так много времени из-за этого.

1 Ответ

0 голосов
/ 13 марта 2012

Предполагая, что действие GetPlaceInfo (int placeID) работает правильно (возвращает правильные данные), я не вижу других ошибок, кроме, возможно, одной.

UpdateTargetId для вашей ссылки действия равен "placeInfo". От msdn : UpdateTargetId Получает или задает идентификатор элемента DOM для обновления с использованием ответа от сервера.

Вы не показывали свое представление полностью, но я думаю, что вам не хватает элемента с id = "placeInfo". Если это так, у ajax просто нет элемента, в который он хочет поместить результат. Попробуйте поместить свою часть в div с таким идентификатором:

<div id="placeInfo">
    @Html.Partial("_PlaceInfo", Model.Places.FirstOrDefault())
</div>

UPDATE: @ Html.Partial () запускается только один раз - когда ваша страница загружается в первый раз. Если он получает правильные данные в первый раз, вам не нужно больше возиться с этим. Элемент div, содержащий эту часть, будет обновлен, когда вы вызовете свой метод GetPlaceInfo по ссылке действия. Таким образом, есть два места для проверки: ваше действие GetPlacesInfo и ActionLink.

Сначала проверьте GetPlacesInfo. Поставьте точку останова, передайте разные идентификаторы и убедитесь, что вы получите правильный результат.

Во-вторых, я не использую расширения MS Ajax (я делаю что-то другое для своих вызовов ajax), но попробуйте это:

@Ajax.ActionLink(item.Name, "GetPlaceInfo", "MainPlaces", new { placeId = item.PlaceID }, new AjaxOptions { UpdateTargetId = "placeInfo", InsertionMode = InsertionMode.Replace, LoadingElementId = "loading" })

Предполагая, что "MainPlaces" является именем контроллера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...