0

jquery ajax を使用して、新しい製品を作成 (入力) するための部分ビューをレンダリングするアクションを呼び出し (取得) します。この部分ビューのコンテンツは、ベース _layout を持つフル ページの vid タグに挿入されます。以下のajaxコード:

 $("#Create").on('click', function (e) {
    //debugger;
    e.preventDefault();
    $.ajax({
        type: "GET",               
        data: { returnUrl: String(window.location) },  <-- passing in the Url
        url: "/CreateGroup/CreateGroup",
        dataType: 'html',
        success: function (data) {
            $("#group-list").html(data);
        },
    });
})
.....
<div id="group-list">
    @Html.Partial("PagedGroupList")
</div>

アクション:

// GET: /Create/
[Authorize]
public PartialViewResult CreateGroup(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    CreateGroupModel cgm = new CreateGroupModel();
    cgm.ReturnUrl = returnUrl;
    cgm.group = new Static_Group();
    return PartialView("CreateGroup", cgm);
}

作成ボタンをクリックする前に最初にログインすると、期待どおりにすべてがうまくいきます。問題は、最初にログインせずに CREATE ボタンをクリックした場合です。[Authorize] により、ログイン ページが最初に表示され、ログイン後、フル ページ内の CREATE partialview に一緒にリダイレクトされることが期待されます。問題は、ログイン ページが、親ビューの要素なしで NAKED の create partialview にリダイレクトされることです。CREATE ページが部分ビューでない場合、ログイン ページはフル ページに完全にリダイレクトされます。

MVC4 デフォルト ログインを使用します。ログインページをajaxフォームサブミットにして、OnSuccessを使ってログインページとパーシャルビューの作成の両方でdocument.locationを呼び出そうとしたのですが、パーシャルビューのreturnUrlの問題であることがわかりました。私も Request.UrlReferrer.AbsoluteUri を試してみましたが、「/CreateGroup/CreateGroup?returnUrl=http%3A%2F%2Fwww.dev.com%3A22531%2F」または完全な同じ URL が返されます: http://www .dev.com:22531/CreateGroup/CreateGroup?returnUrl=http://www.dev.com:22531/ . URL をブラウザーに入力すると、純粋な部分ビューも表示されます。

これは一般的なシナリオであるはずですが、グーグルでスレッドを見つけることができませんでした。親ビュー内の部分ビューを一緒に表示する URL はありますか? そうでない場合、部分ビューから前のビューにリダイレクトすることは可能ですか?


ホスト ページを含むパーシャルビューの URL がないようです。現時点で考えられる解決策は、ホストページへのログインリダイレクトを取得し、モデルまたはビューバッグまたはセッション一時に部分ビュー名を渡して、適切な部分ビューを含むページ全体を再度レンダリングすることです。

4

1 に答える 1

0

これが私がこの問題を回避する方法です。あまり快適に感じないでください。誰かがより良い解決策を持っているなら、助けてください。

LoginModelに2つの文字列変数を追加しました
。publicstringRetUrl{get; セットする; } public string UrlReferrer {get; セットする; }

ログインアクションの取得:

        public PartialViewResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = Request.UrlReferrer.AbsolutePath;
        LoginModel lgm = new LoginModel();
        lgm.UrlReferrer = Request.UrlReferrer.AbsoluteUri;
        lgm.RetUrl = returnUrl;
        return PartialView(lgm);
    }

ログイン後のアクション:

        public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
            {
                model.IsLoggedIn = true;
                if (string.IsNullOrEmpty(model.RetUrl))
                {
                    model.RetUrl = Url.Action("Index", "Home"); 
                }
            }
            else
            {
                // If we got this far, something failed, redisplay form
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }
        return PartialView("Login", model);
    }

Login.cshtmlに:モデルのプリセット値を保持するために2つの非表示フィールドを配置します。

             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)

ajax OnSuccessイベントハンドラーで、returnUrlの最後にCallPartialクエリ文字列を追加し、このreturnUrlにリダイレクトします。

     <script type="text/javascript"> 
function logInComplete() {
    //debugger;
    if ('@Model.IsLoggedIn' == 'True' && '@Model.UrlReferrer' != '') {
        //debugger;
        var returnUrl = '@Model.UrlReferrer';
        if ('@Model.RetUrl' != '@Model.UrlReferrer') {
            if (returnUrl.indexOf('?') == -1) {
                returnUrl = returnUrl + "?CallPartial=True";
            }
            else {
                returnUrl = returnUrl + "&CallPartial=True";
            }
        }
        document.location = returnUrl;
    } 
} 

次に、CREATEpartialviewホストページに戻ります。

         $('.ifCallPartial').each(function () {
        //debugger;
        if ('@Request["CallPartial"]' == "True") {
            $(document).ready(function () {
                CallCreate();
            });
        }
    });

    function CallCreate() {
        //debugger;
        //e.preventDefault();
        var returl = String(window.location);
        var n = returl.indexOf("?CallPartial");
        if (n >= 1) {
            returl = returl.substring(0, n);
        }
        else {
            n = returl.indexOf("CallPartial");
            if (n >= 1) {
                returl = returl.substring(0, n);
            }
        }
        $.ajax({                
            type: "GET",
            data: { returnUrl: returl },
            url: "/CreateGroup/CreateGroup",
            dataType: 'html',
            success: function (data) {
                $("#group-list").html(data);
            },
            error: function (xhr, status, error) {
                alert(error);
            }
        });
    }
于 2013-03-15T01:44:59.540 に答える