2013-10-01 1 views
0

Вид:Просмотр не восстановление на вызов контроллера

@if (Model.IsEventActive) 
{ 
    <div id="GameEvent"> 
     //SomeCode 
    </div> 
} 
else 
{ 
    <div id="GameNonEvent"> 
     //SomeCode 
    </div> 
} 

JS файл:

$('#btnNextEvent').click(function() { 
    $.ajax({     
      type: "POST", 
      url: "Game/UpdateUserEventInfo" 
      //success: function() { 
      // $("#GameEvent").hide(); 
      //} 
     }); 

}); 

Контроллер:

[HttpPost] 
public ActionResult UpdateUserEventInfo() 
{ 
    var user = _user; 
    _instance.Users.UpdateUserEventInfo(user); 
    return RedirectToAction("Index"); 
} 

public ActionResult Index() 
{ 
    if (!_instance.Users.CheckUserSkillsExist(WebSecurity.CurrentUserName)) 
    { 
     return RedirectToAction("CreateChar"); 
    } 

    _instance.GameBase.GetBaseData(); 
    var userModel = GetPlayerDisplayStats(); 
    return View(userModel); 
} 

Если мое начало IsEventActive = истина;

Просмотр FullEvent в определенный момент вызывает мой метод JS, который вызывает вызов ajax для UpdateUserEventInfo.

Итак, в основном то, что должно произойти, - это когда запускается метод контроллера UpdateUserEventInfo, он обновляет базу данных и затем снова вызывает мой индекс. Просмотр индекса перестраивает модель и запускает представление. View проверяет IsEventActive и создает на основе div.

На этой странице показано GameEvent Div в начале, потому что IsEventActive имеет значение true, но когда индексный указатель снова восстанавливается с помощью вызова ajax. Петли if-else следуют правильно и идут в div GameNonEvent и создают его. Но я не вижу этого на странице. На странице все еще отображается GamEvent Div. Хотя представление не входило в утверждение if.

Если я обновляю страницу, она отображается правильно.

ответ

1

Wrap часть зрения, что вы показали в другом контейнере:

@if (Model.IsEventActive) 
{ 
    <div id="container"> 
    <div id="GameEvent"> 
     <div class="col-lg-10 col-lg-offset-1"> 
      <div class="row"> 
       @{ Html.RenderAction("FullEvent", "Game", new { ActiveEventGrpId = Model.ActiveEventGrpId }); } 
      </div> 
     </div> 
    </div> 
    </div> 
} 
else 
{ 
    ... 
} 

Затем в success обработчик ajax вызова сделать:

success: function (data) { 
    $("#container").html(data); 
} 
+0

не будет ли он заканчиваться двойными объявлениями всех элементов html таким образом, если его действие вернет полную страницу (данные)? – vlscanner

+0

он должен убедиться, что в случае 'Model.IsEventActive == false' возвращается только html под' else'. – Igor

+0

Это дает мне представление. Я могу просто создать оба div на загрузке страницы и сделать одну из них скрытой. Затем, после успеха вызова ajax, я могу переключать скрытые классы. Это должно работать правильно? – ArjaaAine

1

если я получить код право это выглядит вы ничего не делаете в результате вызова ajax в «Game/UpdateUserEventInfo», , так что ничего не произойдет. Там, где у вас есть «успех», вы должны иметь код, который обновляет клиентскую часть просмотра. Который может быть большим количеством кода, возможно, что вызов ajax может быть даже не нужен там, href к действию будет просто отлично от функциональной точки. Простой способ , чтобы исправить это (так как вы говорите, обновление страниц работы) должен был бы поставить перезагрузки страницы на Ajax успеха:

$.ajax({     
     type: "POST", 
     url: "Game/UpdateUserEventInfo" 
     success: function() { 
      window.location.reload(); 
     } 
    }); 

, но это будет также успешно отменить весь смысл использования Ajax, вам может понадобиться обзор ваш подход к этому.

+0

Но почему я должен использовать успешную часть вызова ajax, так как мой метод контроллера вызывает перенаправления на представление? Извините, что я еще не очень хорошо знаком с Ajax. – ArjaaAine

+0

есть много учебников онлайн, это должно дать вам хорошую идею https://developer.mozilla.org/en-US/docs/AJAX, тогда вы могли бы лучше понять, какой успех в jquery.ajax означает под капотом так сказать – vlscanner

Смежные вопросы