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 按钮之前先登录,一切都按预期进行。问题是在没有先登录的情况下单击 CREATE 按钮。由于[Authorize],登录页面将首先出现,登录后,预计会一起重定向回我在整个页面内的CREATE部分视图。问题是登录页面重定向回 NAKED 创建部分视图,而没有任何父视图的元素。如果 CREATE 页面不是部分视图,则登录页面将完美地重定向回整个页面。

我使用 MVC4 默认登录。我试图将登录页面变成ajax表单提交并使用OnSuccess在登录页面和创建partialview中调用document.location,但我发现这是partialview的returnUrl问题。我也尝试过 Request.UrlReferrer.AbsoluteUri,但它给出了相同的 URL,即“/CreateGroup/CreateGroup?returnUrl=http%3A%2F%2Fwww.dev.com%3A22531%2F”或完整的:http://www .dev.com:22531/CreateGroup/CreateGroup?returnUrl=http://www.dev.com:22531/。如果将 Url 放入浏览器,它也会显示纯局部视图。

我相信我一定错过了一些明显的事情,因为这应该是一种常见的情况,但我无法从谷歌搜索中找到任何线索。是否有一个 URL 在其父视图中一起显示部分视图?如果没有,那么可以从部分视图重定向回以前的视图吗?


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

4

1 回答 1

0

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

我在 LoginModel 中添加了两个字符串变量:
public string RetUrl { get; 放; } 公共字符串 UrlReferrer { 获取;放; }

在获取登录操作中:

        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 中:放置两个隐藏字段以保留 Model 预设值:

             @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;
    } 
} 

现在回到 CREATE partialview 主机页面:

         $('.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 回答