MVCルートパラメータをどのようにフォーマットしますか?

私はテスト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" として出力するようにフォーマットしたいと考えています。

明らかに、私はアクションリンクを構築するときにフォーマットを指定することができます。

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

しかし、我々はこれが厄介で、扱いにくく、DRYではないことを知っている。

私は、これが答えであることを望んでいるモデルのプロパティで [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}")] 属性を使用しようとしましたが、エディタフォームを構築する。

参考までに、ブラウザのURLに手動で DateTime パラメータを入力した場合(例:/ test/2006-02-16/2008-04-22)、パラメータは正しく解析されます。彼らが私の望むようにフォーマットされています。

5

1 答え

あなたは、日付を持つリンクを扱うためのカスタムヘルパーを書くことができます:

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 linkText, string actionName, object routeValues) {
            return DateLink(htmlHelper, linkText, actionName, new RouteValueDictionary(routeValues), new RouteValueDictionary());
        }
        public static MvcHtmlString DateLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes) {
            return DateLink(htmlHelper, linkText, actionName, new RouteValueDictionary(routeValues), HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
        }
        public static MvcHtmlString DateLink(this HtmlHelper htmlHelper, string linkText, string actionName, RouteValueDictionary routeValues) {
            return DateLink(htmlHelper, linkText, actionName, routeValues, new RouteValueDictionary());
        }
        public static MvcHtmlString DateLink(this HtmlHelper htmlHelper, string linkText, string actionName, RouteValueDictionary routeValues, IDictionary htmlAttributes) {
            if (String.IsNullOrEmpty(linkText)) {
                throw new ArgumentException("linkText");
            }


            //check additional parameters
            List keys = new List(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, linkText, null, actionName, (string)routeValues["controller"], routeValues, htmlAttributes));
        }
    }

そして、あなたはそれを次のように使うことができます:

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

次のURLが生成されます。

http://localhost/MyController/Details/2011-01-01/2012-01-01
4
追加された
私は今、これらの線に沿って何かを使用しています、ありがとう。
追加された 著者 jameskind,