Asp.net mvc 4 登录页面仅重定向回裸partialview

Asp.net mvc 4 登录页面仅重定向回裸partialview,asp.net-mvc-4,url,asp.net-mvc-partialview,Asp.net Mvc 4,Url,Asp.net Mvc Partialview,我使用jQueryAjax调用(获取)一个动作,该动作呈现用于创建(输入)新产品的partialview。此partialview的内容插入到具有基本布局的完整页面中的vid标记中。下面是ajax代码: $("#Create").on('click', function (e) { //debugger; e.preventDefault(); $.ajax({ type: "GET", data: { re

我使用jQueryAjax调用(获取)一个动作,该动作呈现用于创建(输入)新产品的partialview。此partialview的内容插入到具有基本布局的完整页面中的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>
             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
         $('.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);
            }
        });
    }
现在,若我在点击创建按钮之前先登录,一切都会如预期的那个样好。问题是单击“创建”按钮时没有先登录。由于[Authorize],登录页面将排在第一位,在登录之后,它将一起重定向回完整页面内的我的CREATE partialview。问题是登录页面重定向回裸create partialview,而不包含其父视图的任何元素。如果创建页面不是partialview,则登录页面将重定向回完整页面

             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
         $('.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);
            }
        });
    }
我使用MVC4 defafult登录。我试图将登录页面变成ajax表单submit,并使用OnSuccess在登录页面和创建partialview中调用document.location,但我发现这是partialview的returnUrl问题。我还尝试了Request.urlReferer.AbsoluteUri,但它给出的URL与“/CreateGroup/CreateGroup?returnUrl=http%3A%2F%2Fwww.dev.com%3A22531%2F”或完整URL相同:。如果将Url放入浏览器,它也会显示纯partialview

             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
         $('.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);
            }
        });
    }
我相信我一定错过了一些明显的东西,因为这应该是一个常见的场景,但我在谷歌上找不到任何线索。是否有一个URL可以在其父视图中同时显示partialview?如果没有,那么是否可以从partialview重定向回以前的视图

             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
         $('.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);
            }
        });
    }


看起来没有包含其主机页的partialview的URL。目前我能想到的解决方案是让登录重定向到主机页,并在Model或viewbag或session temp中传入partialview名称,以再次呈现包含正确partialview的整个页面。

以下是我解决此问题的方法。我觉得不太舒服。如果有人有更好的解决方案,请帮助

             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
         $('.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);
            }
        });
    }
我在LoginModel中添加了两个字符串变量:
公共字符串RetUrl{get;set;} 公共字符串URLreferer{get;set;}

             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
         $('.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);
            }
        });
    }
在获取登录操作中:

        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);
    }
             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
         $('.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);
            }
        });
    }
在登录后操作中:

// 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);
}
        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);
    }
             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
         $('.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);
            }
        });
    }
在Login.cshtml中:放置两个隐藏字段以保留模型预设值:

             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
         $('.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);
            }
        });
    }
在ajax OnSuccess事件处理程序中,将CallPartial querystring追加到returnUrl的末尾,并重定向到此returnUrl:

             @Html.HiddenFor(m => m.RetUrl)
             @Html.HiddenFor(m => m.UrlReferrer)
     <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;
    } 
} 
         $('.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);
            }
        });
    }