加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 使用和不使用查询字符串路由旧请求

发布时间:2020-12-16 03:53:26 所属栏目:asp.Net 来源:网络整理
导读:(开始之前:我知道 this和 this.我想找到一个更简洁的解决方案 – 如果可能的话 – 稍微更具体的问题) 我正在重写MVC中的旧Webforms应用程序.像往常一样,不应该破坏永久链接. 我正在使用标准{controller} / {action} / {id}路由.传统路径通常是SomePage.aspx
(开始之前:我知道 this和 this.我想找到一个更简洁的解决方案 – 如果可能的话 – 稍微更具体的问题)

我正在重写MVC中的旧Webforms应用程序.像往常一样,不应该破坏永久链接.

我正在使用标准{controller} / {action} / {id}路由.传统路径通常是SomePage.aspx?ID = xxx,我有一个特殊情况,其中Foo.aspx是Bar的列表(新URL:/ Bar或/ Bar / Index)和
?Foo.aspx?ID = xxx是条形细节(新网址:/ Bar / View / xxx)

一种可能的解决方法是在默认MapRoute之前添加以下内容:

routes.MapRoute("Bar View","Foo.aspx",new { controller = "Bar",action = "View" });

然后在BarController中定义相应的操作:

public ActionResult View(int? id)
{
    if (id == null)
        return RedirectToAction("Index");
    return View();
}

这有两个问题:

>现在,如果我创建一个ActionLink,它将使用旧格式
>我想在路线上处理这件事;使id可以为空并在控制器中重定向是错误的

我可以手动映射遗留URL(我不需要通用解决方案,只有大约8页)

这是一个新项目,所以我没有任何关系.

解决方法

我能够基于 Dangerous’ idea加上基于 this answer的约束来解决这个问题.

我的新路线表是:

routes.MapRoute("Bar","Bar/{action}/{id}",new
                {
                    controller = "Bar",action = "Index",id = UrlParameter.Optional
                });
routes.MapRoute("Bar View",new {controller = "Bar",action = "View"},new {id = new QueryStringConstraint()});
routes.MapRoute("Bar Index",action = "Index" });
routes.MapRoute("Default",/*...*/);

并且QueryStringConstraint不可能更简单:

public class QueryStringConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext,Route route,string parameterName,RouteValueDictionary values,RouteDirection routeDirection)
    {
        return httpContext.Request.QueryString.AllKeys
            .Contains(parameterName,StringComparer.InvariantCultureIgnoreCase);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读