2010-07-26 4 views
1

Я работаю с MVC 2 на некоторое время, и я закончил ReturnToAction, а также ValidationSummary, но это немного отличается тем, что мои кнопки отправки управления javascript/JQuery - я отлаживаю действие, и он переходит в правильное действие контроллера, но как только он переходит через RedirecToAction, ничего не происходит ....Asp.Net MVC 2 - Странное поведение: RedirectToAction и ValidationSummary не работает

Моя вторая проблема заключается в том, что мой ValidationSummary не отображается - я запускаю test и когда он возвращает вид, когда ModelState недействителен - ничего не отображается

Это проблема с моими кнопками/forms/submit/JQuery?

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">  

<script type="text/javascript"> 
    $(function() { 

      /*stuff here to setup some JQuery Sortable lists*/ 

     $("#UpdateButton").click(function() { 

      //create Arrays from JQuery Sortable List and go to Action for "submit"     //processing 

      $.ajax({ 
       url: '/Admin/SortedLists/', 
       data: { items: editedRoles, items2: $("#deleteList").sortable('toArray') }, 
       type: 'POST', 
       traditional: true 
      }); 
     }); 

      //go to Action and just "Reload" the page 
     $("#UndoButton").click(function() { 
      //reload the page 
       var url = '<%= Url.Action("EditRoles") %>';     
      window.location.href = url; 
     }); 

     $("#roleList, #deleteList").disableSelection(); 
     $("#deleteList").hide(); 
    }); 


    function addNewRole() { 
     var text = $("#New_Role").val(); 

     $("#roleList").append('<li id="-1~' + text + '" class="ui-state-default">' + 
           '<span class="ui-icon ui-icon-closethick"></span>' + 
     //     '<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>' + 
           '<input id="-1" type="text" value="' + text + '" />' +          
           '</li>'); 
     $("#roleList").sortable('refresh'); 
    } 
</script> 

<%= Html.ActionLink("Back", "Index") %>  

<% using (Html.BeginForm()) { %>  
    <br />  
    <%= Html.Encode(ViewData["Message"]) %> 
    <%=Html.ValidationSummary(true, "Edit was unsuccessful. Please correct the errors and try again.")%> 
    <div class="demo">   

     <%=Html.TextBox("New Role", "New Role")%> 
     <a href="javascript:addNewRole()"> Add</a> 

     <br /> 
     <br /> 
     <ul id="roleList" class='droptrue'> 

     //create an unordered list with textboxes and a close icon 
      <% 
      foreach (var item in Model.Roles) 
      {%>         
      <li class="ui-state-default" id="<%=Html.AttributeEncode(item.Id)%>~<%=Html.AttributeEncode(item.Name)%>"><span class="ui-icon ui-icon-closethick"></span><%=Html.TextBox(item.Id.ToString(), item.Name, new {@id = item.Id})%></li>                    

     <% } %>   
     </ul> 

     <ul id="deleteList" class='droptrue'> 
     </ul>   

     <br /> 

     </div>   

      <input id="UpdateButton" type="submit" name="submitButton" value="Update" /><%= Html.ValidationMessage("UpdateButton", "*") %>     
      <input id="UndoButton" type="submit" name="submitButton" value="Undo" />    

<% } %> 

И контроллер выглядит следующим образом:

public AdminController() 
    { 
     var wrapper = new ModelStateWrapper(ModelState); 
     _rolesService = new RolesService(new RolesRepository(), new RolesValidator(wrapper, new DateValidator(wrapper))); 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult EditRoles() 
    { 
     var roles = _rolesService.FetchAllRoles(); 
     return View(new AdminEditRolesViewModel(roles)); 
    } 

    [HttpPost] 
    public ActionResult SortedLists(List<string> items, List<string> items2) 
    { 
     var roles = _rolesService.BuildRolesFromList(items); 
     var deletedRoles = _rolesService.BuildRolesFromList(items2); 

     //The Services have contain the ModelState, this is where errors happen 
     //ValidationSummary doesnt show anything 
     if (_rolesService.EditRoles(roles) == false) 
     { 
      roles = _rolesService.FetchAllRoles(); 
      return View("EditRoles", new AdminEditRolesViewModel(roles)); 
     } 

     if (_rolesService.DeleteRoles(deletedRoles) == false) 
     { 

      roles = _rolesService.FetchAllRoles(); 
      return View("EditRoles", new AdminEditRolesViewModel(roles)); 
     } 

     _rolesService.Save(); 

     //This RedirecToAction is passed, but doesnt actually go to my Index() 
     return RedirectToAction("Index"); 

    } 

Мои услуги обрабатывать вещи, как проверка, я передать его в ModelState и ModelStateDictionary обертку и добавить ошибок - я я добавлять ошибки неправильно ?

public bool DeleteRoles(IEnumerable<Role> deletedRoles) 
{ 
    //some work, if fails add error 

    _validator.AddError("UpdateButton", 
     "Role: " + role.Name + 
     " can not be deleted because Employees still use this"; 

    return _validator.IsValid(); 
} 

Спасибо за любую помощь - это сводит меня вверх по стене

ответ

0

Я думаю, что у вас есть несколько проблем.

  • Перенаправление не происходит так, как вы ожидаете

Я думаю, это потому, что ваша посылка формы асинхронно с $.ajax() вызова, но вы не обрабатывает возвращаемые значения. A RedirectToAction возвращает URL-адрес и код состояния HTTP 302 (может быть, 301, я забыл), который сообщает браузеру, чтобы он запросил возвращаемый URL-адрес. Действие вашего контроллера возвращает HTTP-перенаправление на вызов async javascript, который не обрабатывает его.

Вам необходимо изменить ваше представление JavaScript или обработать возвращаемое значение с чем-то вроде .ajaxSuccess().

  • Проверка не отображается.

Ваш валидатор не отображается по двум причинам. Первое из-за возвращаемой вещи ajax, которую я только что описал. Во-вторых, вы потеряли ModelState, когда вы сделали RedirectToAction. Если вы явно не обрабатываете передачу ModelState (обычно, экспортируя ее в TempData и импортируя ее в целевое действие), она будет потеряна при перенаправлении.

+0

Джош, мне тоже это нужно. Если вы опубликуете пример кода, который будет работать для меня, я буду рад наградить вас щедростью, которую я разместил. – Rap

+0

Ба, просто увидел это. Извините за задержку. Если ответ Криса не сработает для вас, сообщите мне, и я передумаю. – Josh

2

Это нормально для передачи через RedirectToAction() в отладчике. На самом деле он не будет перенаправлять, пока не вернется из метода. Но действие вашего контроллера запущено. Вы просто ничего не видите, потому что ваш уровень представления переднего плана, который является веб-страницей, ничего не делает для обработки обратного вызова, который задает ваш вызов ajax. Для того, чтобы решить, что вы будете создавать функцию обратного вызова следующим образом:

 $.ajax({ 
      url: '/Admin/SortedLists/', 
      data: { items: editedRoles, items2: $("#deleteList").sortable('toArray') }, 
      type: 'POST', 
      traditional: true, 
      success: function(data) { 
       alert(data); 
      } 
     }); 

Очевидно, что вы будете делать что-то более полезное «данные», но мы просто отображая его на данный момент.

ValidatorSummary не отображается, потому что метод, который его создает, не является вашим действием при отправке POST.Он «удаляется» из RedirectToAction. Для того, чтобы решить, что вы будете использовать что-то вроде этого, вместо:

return View("~/Views/Home/Index.aspx", model); 

Это будет посылать пользователю непосредственно там и будет сохранять ModelState, в том числе валидаций.

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