Как мне отформатировать параметры MVC Route? - PullRequest
5 голосов
/ 06 февраля 2012

В моем тестовом проекте 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

Как видите, инфраструктура вызвала ToString() для параметров DateTime и затем закодировала результат.

Я бы хотел отформатировать параметры маршрута DateTime, чтобы они выводились как "гггг-ММ-дд" .

Очевидно, я могу указать формат при построении ссылки на действие, например, -

@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")
})

Однако мы знаем, что это грязно, громоздко и не СУХОЙ.

Я пытался использовать атрибут [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}")] в свойствах модели, надеясь, что это был ответ, однако кажется, что они учитываются только при создании форм редактора.

К вашему сведению, если я вручную введу параметры DateTime в URL в моем браузере (например, / test / 2006-02-16 / 2008-04-22), параметры будут правильно проанализированы, так что это всего лишь случай получения их отформатировали так, как я хочу.

1 Ответ

4 голосов
/ 06 февраля 2012

Вы можете написать собственный помощник для обработки ссылок с датами:

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<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, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...