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

asp.net-mvc-3 – 如何格式化MVC Route参数?

发布时间:2020-12-16 03:27:00 所属栏目:asp.Net 来源:网络整理
导读:我在我的测试MVC3项目中映射了以下路由 – routes.MapRoute( "TestRoute","test/{DateFrom}/{DateTo}",new { controller = "Home",action = "TestRoute" }); 然后我在视图中建立一个链接如下 – @Html.ActionLink("Test Link","TestRoute",new{ DateFrom = n
我在我的测试MVC3项目中映射了以下路由 –

routes.MapRoute(
    "TestRoute","test/{DateFrom}/{DateTo}",new { controller = "Home",action = "TestRoute" }
);

然后我在视图中建立一个链接如下 –

@Html.ActionLink("Test Link","TestRoute",new
{
    DateFrom = new DateTime(2006,02,16),DateTo = new DateTime(2008,04,22)
})

在渲染时,输出此URL –

/test/02/16/2006%2000%3a00%3a00/04/22/2008%2000%3a00%3a00

如您所见,框架已在DateTime参数上调用ToString(),然后对结果进行编码.

我想格式化DateTime路由参数,以便它们输出为“yyyy-MM-dd”.

显然我可以在构建Action Link时指定格式,如下所示 –

@Html.ActionLink("Test Link",16).ToString("yyyy-MM-dd"),22).ToString("yyyy-MM-dd")
})

但是我们知道这很麻烦,很麻烦而且不干.

我已经尝试在模型中的属性上使用[DisplayFormat(DataFormatString =“{0:dd-MM-yyyy}”)]属性,希望这是答案,但是看起来这些只在构建编辑器表单时才受到尊重.

仅供参考,如果我在浏览器的URL中手动输入DateTime参数(例如/ test / 2006-02-16 / 2008-04-22),参数会被正确解析,所以这只是将它们格式化为我想要的情况.

解决方法

您可以编写自定义帮助程序来处理具有日期的链接:

namespace System.Web.Mvc {
    public static class LinkExtensions {
        public static MvcHtmlString DateLink(this HtmlHelper htmlHelper,string linkText,string actionName) {
            return DateLink(htmlHelper,linkText,actionName,new RouteValueDictionary(),null);
        }
        public static MvcHtmlString DateLink(this HtmlHelper htmlHelper,string actionName,object routeValues) {
            return DateLink(htmlHelper,new RouteValueDictionary(routeValues),new RouteValueDictionary());
        }
        public static MvcHtmlString DateLink(this HtmlHelper htmlHelper,object routeValues,object htmlAttributes) {
            return DateLink(htmlHelper,HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
        }
        public static MvcHtmlString DateLink(this HtmlHelper htmlHelper,RouteValueDictionary routeValues) {
            return DateLink(htmlHelper,routeValues,RouteValueDictionary routeValues,IDictionary<string,object> htmlAttributes) {
            if (String.IsNullOrEmpty(linkText)) {
                throw new ArgumentException("linkText");
            }


            //check additional parameters
            List<string> keys = new List<string>(routeValues.Keys);
            foreach (string key in keys) {
                 if (routeValues[key].GetType() == typeof(DateTime))
                      routeValues[key] = ((DateTime)routeValues[key]).ToString("yyyy-MM-dd");
            }

            return MvcHtmlString.Create(HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext,htmlHelper.RouteCollection,null,(string)routeValues["controller"],htmlAttributes));
        }
    }

然后你可以像这样使用它:

@Html.DateLink("TestLink","Details",new { starttime = new DateTime(2011,1,1),endtime = new DateTime(2012,1)})

这会产生以下URL:

http://localhost/MyController/Details/2011-01-01/2012-01-01

(编辑:李大同)

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

    推荐文章
      热点阅读