【问题标题】:RewritePath instead of return view in MVCRewritePath 而不是 MVC 中的返回视图
【发布时间】:2012-06-01 18:41:07
【问题描述】:

有没有办法重写显示不同视图的路径而不是 RedirectToAction 或 Redirect?我不希望 url 改变,但注意常规的 RewritePath 不能“返回”,所以动作实际上一直在跟踪它!

public ActionResult Register(){
    if (somehting){
        HttpContext.RewritePath(url);
        // I want it to stop here, somehow, but it keeps going and expects a return statement
    }
    return View();
}

更新:我刚刚注意到,当我使用 stackoverflow 中循环的一个(使用 ProcessRequest)时,如果我运行 F5 它可以工作,但是当我直接访问时,它给了我“'HttpContext.SetSessionStateBehavior' 只能在 'HttpApplication.引发 AcquireRequestState' 事件。”这意味着我在 IIS 设置中遗漏了一些东西,它是什么? :s

[更新]为了明确这一点,我需要重写一个“url”而不是操作或视图名称,它必须是一个 url,就像好的旧 RewritePath(url)

【问题讨论】:

  • 像 MVC 中的错误处理程序一样工作,它重写到错误页面
  • 没有人得到答案,我仍然不知道如何在 MVC 上重写路径,在 ASP.NET 中真是太容易了!我很确定它与 MVC 中构建的对象的顺序有关,首先调用路由,然后调用控制器,然后是使响应刷新的东西,不允许重写路径生效......仍然,必须有一种方法
  • 这个问题我该怎么办?没有答案,我应该删除吗?

标签: asp.net-mvc rewrite rewritepath


【解决方案1】:

这就是我最终所做的,受到斯蒂芬回答的启发,创建了一个处理返回视图的方法:

首先是全局方法(这里它在 Home 控制器中命名为 Timeout) 在 HomeController.cs 下:

public ActionResult TimeOut(){
    return View("TimeOut"); // the string is essential
}

其他地方:

if (soemthing){
    return new HomeController().TimeOut(); }

有异议吗?做错了吗?

【讨论】:

  • 附言。 TimeOut 字符串指的是新控制器文件夹下的超时页面,而不是在 Home 控制器文件夹中,太糟糕了!
  • 这是我能模仿的最接近的简单重写规则
【解决方案2】:

除了 Cyril 的回答之外,您还可以直接调用另一个 Controller 方法并返回该方法的结果。假设您有一个方法如下,它返回您想要返回的内容。

    public ActionResult SpecialRegistration()
    {
       //TODO:  implement logic that does stuff
       return View();  // Shows the View named SpecialRegistration
    }

现在在您的常规注册方法中,您可以调用它

    public ActionResult Register(){
        if (something){
            return SpecialRegistration();
        }
   }

【讨论】:

  • 这意味着它们必须在同一个控制器中,太严格了
  • 我刚试过这个,奇怪的是,调用 SpecialRegistration 会按原样返回注册视图 (register.cshtml),有意义吗?
  • 受这个答案的启发,我发现了如何绕过它,但它并不像我希望的那样干净......查看答案
【解决方案3】:

使用不同的模型返回不同的视图,并且 url 不会改变。

假设您有一个名为 Hello.cshtml 的视图。

return View('Hello',Model);

因此,您返回的视图与操作不同,url 保持不变,用户的视图发生变化。

【讨论】:

  • 我想重写一个 url,因为我只是保存了每个 url 指向的查找表,我不能使用显式视图名称
  • 你不清楚,告诉我们你想要达到的目标。
  • 西里尔,返回视图不能跨不同的控制器工作
  • 那么你的解决方案很好。这意味着我的意思,但跨控制器。
  • 不,实际上它做了同样的事情,它返回了当前操作的视图,而不是 HomeController TimeOut
【解决方案4】:

仅用于动作重定向:

使用示例return RedirectToAction("Action","Controller",new {id=1});

对于网址重定向:

可以使用return Redirect(URL);

也是 HttpContext.RewritePath(url); 之后的表达式使用 response.end();

【讨论】:

  • 重定向方案改变了 url,我不希望这样,我确实尝试了 response.end,响应严重结束但它没有重定向到任何东西,我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2021-06-18
  • 2012-07-10
相关资源
最近更新 更多