Asp. Сетевой MVC 2 - Странное поведение: RedirectToAction и ValidationSummary, не работающий

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

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

Действительно ли это - проблема с моим, застегивать/формироваться/отправлять/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();  
} 

Спасибо за любую справку - это управляет мной стена

1
задан Kelsey 26 July 2010 в 18:52
поделиться

1 ответ

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

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

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

Вам нужно либо изменить JavaScript отправки, либо обработать возвращаемое значение чем-то вроде .ajaxSuccess().

  • ValidationSummary не отображается.

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

0
ответ дан 2 September 2019 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: