1

私はしばらくMVC 2を使用しており、ReturnToActionとValidationSummaryを実行しましたが、これは「送信」ボタンがjavascript/JQueryによるコントロールであるという点で少し異なります-アクションをデバッグし、正しいController Action ですが、RedirectToAction を通過すると、何も起こりません....

私の2番目の問題は、ValidationSummaryが表示されないことです-テストを実行し、ModelStateが無効なときにViewを返すと、何も表示されません

ボタン/フォーム/送信/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();  
} 

助けてくれてありがとう - これは私を壁に追いやっています

4

2 に答える 2

2

デバッガーでRedirectToAction()を渡すのは正常です。メソッドから戻るまで、実際にはリダイレクトは行われません。しかし、コントローラーアクションは実行されています。Webページであるフロントエンドプレゼンテーション層は、ajax呼び出しが設定するコールバックを処理するために何もしていないため、何も表示されていません。これを解決するには、次のようなコールバック関数を作成します。

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

明らかに、「データ」を使用してより便利なことを行うことになりますが、ここではそれを表示しているだけです。

validatorSummaryを作成しているメソッドは、POST時のアクションではないため、validatorSummaryは表示されません。RedirectToActionによって「消去」されています。これを解決するには、代わりに次のようなものを使用します。

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

これにより、ユーザーが直接そこに送信され、検証を含むモデルの状態が保持されます。

于 2010-12-26T23:27:09.110 に答える
0

いくつか問題があると思います。

  • 期待どおりにリダイレクトされない

これは、呼び出しと非同期でフォームを投稿しているためだと思います$.ajax()が、戻り値を処理していません。ARedirectToActionは URL と HTTP ステータス コード 302 (301 かもしれませんが、忘れました) を返します。これは、返された URL を要求するようにブラウザーに指示します。コントローラーのアクションが HTTP リダイレクトを非同期の JavaScript 呼び出しに返していますが、これはそれを処理していません。

送信 JavaScript を変更するか、戻り値を のようなもので処理する必要があります.ajaxSuccess()

  • ValidationSummary が表示されません。

ValidationSummary が表示されない理由は 2 つあります。1 つ目は、先ほど説明した ajax の戻り値のためです。2 つ目は、実行時に ModelState を「失った」ことですRedirectToAction。ModelState 転送を明示的に処理しない限り (通常は、TempData にエクスポートしてターゲット アクションにインポートすることによって)、リダイレクト時に失われます。

于 2010-08-16T02:12:18.353 に答える