.net mvc3 从一个action重定向到另外一个action时 弹出提示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net mvc3 从一个action重定向到另外一个action时 弹出提示相关的知识,希望对你有一定的参考价值。

我使用Response.Write("<script>alert(11)</script>")完全没有反应,想使用ViewData["someValue"]传一个动态数据过去,也行不通,应该怎么做了?

我的建议是使用使用重定向到另一个action:Redirect("/Main/LoginPage");,然后在另一个action页面加载完毕后alert();不就行了吗。
例如
<script type="text/javascript">
$(function()
alert("11");
);
</script>

如果想传递数据:Redirect("/Main/LoginPage?key="+ViewData["someValue"].ToString());然后在LoginPagin这个action里面取key的值,不久得到了吗!已经很详细了。
望采纳。追问

这种方法确实可以 但是我现在只是要加一个弹出提示,如果因为这个去该跳转方式,怕改动就有点大了 ,还有其它的方法吗?

追答

这种跳转一般情况下是加一个中间单独的跳转页,在跳转页里面弹出提示,你看现在很多大型的网站登陆都是这种方式。我记得在webform里面有向客户端输出脚本的方法:
ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "msg" + Guid.NewGuid().ToString(), "alert('弹出信息');this.location='/Main/LoginPage';", false);
我没测试,你试试。MVC里面我不知道行不行。

追问

这种方法在asp.net中倒是可以,但是在mvc3中不行,查了下资料貌似不支持

参考技术A public ActionResult A()

return RedirectToAction("B");



public ActionResult B()

return Content("<script>alert(11)</script>");
追问

B也有自己的业务 怎么可能值弹出一个提示 而且还不好判断是哪个重定向到B的所以这种方法基本不行

追答

.net mvc3 从一个action重定向到另外一个action时 弹出提示

这是你的问题
我的回答已经满足了

参考技术B public ActionResult B()

return Content("<script>alert(11);location.href='/Home/Index';</script>");

如何在 ASP.NET MVC 中重定向到动态登录 URL

【中文标题】如何在 ASP.NET MVC 中重定向到动态登录 URL【英文标题】:How to redirect to a dynamic login URL in ASP.NET MVC 【发布时间】:2010-09-26 07:10:16 【问题描述】:

我正在创建一个为客户托管页面的多租户网站。 URL 的第一段将是一个标识客户端的字符串,在 Global.asax 中使用以下 URL 路由方案定义:

"client/controller/action/id"

这很好用,使用 /foo/Home/Index 等 URL。

但是,当使用 [Authorize] 属性时,我想重定向到也使用相同映射方案的登录页面。因此,如果客户端是 foo,登录页面将是 /foo/Account/Login 而不是 web.config 中定义的固定 /Account/Login 重定向。

MVC 使用 HttpUnauthorizedResult 返回 401 未授权状态,我认为这会导致 ASP.NET 重定向到 web.config 中定义的页面。

那么有人知道如何覆盖 ASP.NET 登录重定向行为吗?还是通过创建自定义授权属性在 MVC 中重定向更好?

编辑 - 回答: 在深入研究 .Net 源代码后,我认为自定义身份验证属性是最佳解决方案:

public class ClientAuthorizeAttribute: AuthorizeAttribute

    public override void OnAuthorization( AuthorizationContext filterContext )
    
        base.OnAuthorization( filterContext );

        if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
        
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                
                     "client", filterContext.RouteData.Values[ "client" ] ,
                     "controller", "Account" ,
                     "action", "Login" ,
                     "ReturnUrl", filterContext.HttpContext.Request.RawUrl 
                );
        
    

【问题讨论】:

对路由做几乎完全相同的事情,所以我需要这个!谢谢! 谢谢,我正试图弄清楚如何做类似的事情。 它给了我自己实现的想法,非常感谢! 如果使用 MVC 2 及更高版本,请务必设置 area=null(或设置为正确的区域) - 否则它将从您尝试访问的页面继承 没有 MVC 有什么方法可以做到这一点? 【参考方案1】:

在 RTM 版本的 ASP.NET MVC 中,缺少 Cancel 属性。此代码适用于 ASP.NET MVC RTM:

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Resources;

namespace ePegasus.Web.ActionFilters

    public class CustomAuthorize : AuthorizeAttribute
    
        public override void OnAuthorization(AuthorizationContext filterContext)
        
            base.OnAuthorization(filterContext);
            if (filterContext.Result is HttpUnauthorizedResult)
            
                filterContext.Result = new RedirectToRouteResult(
                    new System.Web.Routing.RouteValueDictionary
                        
                                 "langCode", filterContext.RouteData.Values[ "langCode" ] ,
                                 "controller", "Account" ,
                                 "action", "Login" ,
                                 "ReturnUrl", filterContext.HttpContext.Request.RawUrl 
                        );
            
        
    


编辑:您可能希望禁用 web.config 中的默认表单身份验证 loginUrl - 以防有人忘记您有自定义属性并错误地使用了内置的 [Authorize] 属性。

修改web.config中的值:

 <forms loginUrl="~/Account/ERROR" timeout="2880" />

然后创建一个操作方法 'ERROR' 记录错误并将用户重定向到您拥有的最通用的登录页面。

【讨论】:

如果使用 MVC 2 及更高版本,请务必将 area, null 添加到字典(或任何您的区域) - 否则它将从您尝试访问的页面继承 【参考方案2】:

我认为主要问题是,如果您要搭载内置的 ASP.NET FormsAuthentication 类(并且没有充分的理由不应该),那么一天结束时就会调用FormsAuthentication.RedirectToLoginPage() 将查看一个配置的 URL。永远只有一个登录 URL,这就是他们设计的方式。

我对这个问题(可能是 Rube Goldberg 实现)的尝试是让它重定向到所有客户端共享的根目录中的单个登录页面,例如 /account/login。这个登录页面实际上不会显示任何内容;它检查 ReturnUrl 参数或我在会话中获得的某个值或标识客户端的 cookie,并使用它来发出立即 302 重定向到特定的 /client/account/login 页面。这是一个额外的重定向,但可能不会引人注意,它允许您使用内置的重定向机制。

另一种选择是根据您的描述创建您自己的自定义属性,并避免在FormsAuthentication 类上调用RedirectToLoginPage() 方法的任何内容,因为您将用自己的重定向逻辑替换它。 (您可以创建自己的类似类。)由于它是一个静态类,我不知道有任何机制可以注入您自己的替代接口并让它与现有的 [Authorize] 属性一起神奇地工作,它打击,但people have done similar things before。

希望有帮助!

【讨论】:

这可能是最安全的方法。创建自己的 [MyAuthorize] 属性是危险的。除非您的构建验证人们不使用内置的 [Authorize] 属性,否则您可能会冒着人们(或您自己)忘记和使用错误的风险 在某些情况下,覆盖Application_AuthenticateRequest 可能会有所帮助(请参阅下面的答案)。【参考方案3】:

我对这个问题的解决方案是自定义ActionResult 类:

    sealed public class RequiresLoginResult : ActionResult
    
        override public void ExecuteResult (ControllerContext context)
        
            var response = context.HttpContext.Response;

            var url = FormsAuthentication.LoginUrl;
            if (!string.IsNullOrWhiteSpace (url))
                url += "?returnUrl=" + HttpUtility.UrlEncode (ReturnUrl);

            response.Clear ();
            response.StatusCode = 302;
            response.RedirectLocation = url;
        

        public RequiresLoginResult (string returnUrl = null)
        
            ReturnUrl = returnUrl;
        

        string ReturnUrl  get; set; 
    

【讨论】:

【参考方案4】:

不过,如果决定使用内置的 ASP.NET FormsAuthentication,则可以在 Global.asax.cs 中覆盖 Application_AuthenticateRequest,如下所示:

protected void Application_AuthenticateRequest(object sender, EventArgs e)

    string url = Request.RawUrl;

    if (url.Contains(("Account/Login"))
    
        return;
    

    if (Context.User == null)
    
        // Your custom tenant-aware logic
        if (url.StartsWith("/foo"))
        
            // Your custom login page.
            Response.Redirect("/foo/Account/Login");
            Response.End();
            return;
        
    

【讨论】:

以上是关于.net mvc3 从一个action重定向到另外一个action时 弹出提示的主要内容,如果未能解决你的问题,请参考以下文章

当用户在 asp.net mvc3 中未授权时重定向到另一个页面

当用户在 asp.net mvc3 中未授权时重定向到另一个页面

IIS 上的 ASP.NET MVC3 和 Windows Auth 不断重定向到 /Account/Login

ModelAndView重定向带参数解决方法

如何在 ASP.NET MVC 中重定向到动态登录 URL

MVC 3 - 基于国家的重定向?