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

asp.net-mvc-2 – 在名称中使用连字符处理MVC2变量

发布时间:2020-12-15 20:57:19 所属栏目:asp.Net 来源:网络整理
导读:我正在使用一些第三方软件,它们在名称中创建带有连字符的查询字符串参数.我正在看一下 this SO question,看起来他们的解决方案非常接近我需要的但是我对基础MVC的东西太无知了,想弄清楚如何调整它来做我需要的东西.理想情况下,我想简单地用下划线替换连字符,
我正在使用一些第三方软件,它们在名称中创建带有连字符的查询字符串参数.我正在看一下 this SO question,看起来他们的解决方案非常接近我需要的但是我对基础MVC的东西太无知了,想弄清楚如何调整它来做我需要的东西.理想情况下,我想简单地用下划线替换连字符,这将是一个很好的解决方案.如果有一个更好的,那么我有兴趣听到它.

我想要处理的URL的一个例子是:

http://localhost/app/Person/List?First-Name=Bob&My-Age=3

使用此控制器:

public ActionResult List(string First_Name,int My_Age)
{
    {...}
}

重复一遍,我无法更改生成的查询字符串,所以我需要以某种方式支持它与我的控制器.但是怎么样?

作为参考,下面是自定义RouteHandler,用于处理控制器名称中的下划线和上面引用的SO问题中的操作名称,我们可以修改它以实现我想要的:

public class HyphenatedRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler  GetHttpHandler(RequestContext requestContext)
    {
        requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-","_");
        requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-","_");
        return base.GetHttpHandler(requestContext);
    }
}

解决方法

你试过[Bind(Prefix =“First-name”)]吗?它可能有用……

一种方法是使用自定义模型绑定器.另一种方法是使用动作过滤器.如果要对特定类型执行此操作,请使用模型绑定器.如果要对特定操作或控制器执行此操作,请使用操作筛选器.因此,对于后一种方法,您可以执行以下操作:

public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var keys = filterContext.HttpContext.Request.QueryString.AllKeys.Where(k => k.Contains('-'));
        foreach(var k in keys)
        {
            filterContext.ActionParameters.Add(
                new KeyValuePair<string,object>(
                    k.Replace('-','_'),filterContext.HttpContext.Request.QueryString[k]));
        }
        base.OnActionExecuting(filterContext);
    }

(编辑:李大同)

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

    推荐文章
      热点阅读