Как я могу иметь строчные маршруты в ASP.NET MVC?

Подкласс AdminTimeWidget, чтобы включить измененный DateTimeShortcuts.js (получить к нему в секунду), затем подкласс AdminSplitDateTime включить ваш подклассы MyAdminTimeWidget вместо стандартного Django:

from django.contrib.admin.widgets import AdminTimeWidget
from django.conf import settings

class MyAdminTimeWidget(AdminTimeWidget):
    class Media:
        js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
              settings.MEDIA_URL + "js/admin/DateTimeShortcuts.js")

class MyAdminSplitDateTime(AdminSplitDateTime):
    def __init__(self, attrs=None):
        widgets = [AdminDateWidget, MyAdminTimeWidget]
        forms.MultiWidget.__init__(self, widgets, attrs)

Секретный соус находится в django/contrib/admin/media/js/admin/DateTimeShortcuts.js. Это то, что создает список, который вы хотите изменить. Скопируйте этот файл и вставьте его в каталог site_media/js/admin вашего проекта. Соответствующий код, который вам нужно изменить, находится в строках 85-88:

quickElement("a", quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().strftime('" + time_format + "'));");
quickElement("a", quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,0,0,0,0).strftime('" + time_format + "'));");
quickElement("a", quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,6,0,0,0).strftime('" + time_format + "'));");
quickElement("a", quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,12,0,0,0).strftime('" + time_format + "'));");

Просто добавьте / удалите / измените этот бит javascript на контент вашего сердца.

Наконец, присоедините свой новый виджет к любым типам DateTimeFields, которые вам нравятся. Лучше всего для этого, вероятно, будет атрибут formfield_overrides на ModelAdmin:

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.DateTimeField: {'widget': MyAdminSplitDateTime},
    }
141
задан 5 revs, 2 users 57% 17 November 2010 в 22:37
поделиться

6 ответов

Эти два руководства помогли, когда я хотел сделать то же самое и хорошо работать:

http://www.coderjournal.com/2008/03/force-mvc-route-url -lowercase / http://goneale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/

РЕДАКТИРОВАТЬ: для проектов с областями вам необходимо изменить GetVirtualPath () метод:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
  var lowerCaseValues = new RouteValueDictionary();

  foreach (var v in values)
  {
    switch (v.Key.ToUpperInvariant())
    {
      case "ACTION":
      case "AREA":
      case "CONTROLLER":
        lowerCaseValues.Add(v.Key, ((string)v.Value).ToLowerInvariant());
        break;
      default:
        lowerCaseValues.Add(v.Key.ToLowerInvariant(), v.Value);
        break;
    }
  }
  return base.GetVirtualPath(requestContext, lowerCaseValues);
}
44
ответ дан 23 November 2019 в 22:46
поделиться

Не могли бы вы использовать атрибут ActionName?

 [ActionName("more_details")]
 public ActionResult MoreDetails(int? page)
 {

 }

Я не думаю, что регистр имеет значение. More_Details, more_DETAILS, mOrE_DeTaIL в URL-адресе ведут к одному и тому же действию контроллера.

2
ответ дан 23 November 2019 в 22:46
поделиться

Это действительно имеет два ответа:

  1. Вы уже можете это сделать: движок маршрута выполняет сравнение без учета регистра. Если вы введете маршрут в нижнем регистре, он будет направлен к соответствующему контроллеру и действию.
  2. Если вы используете элементы управления, которые генерируют ссылки маршрута (ActionLink, RouteLink и т. Д.), Они будут создавать ссылки в смешанном регистре, если вы не переопределите это поведение по умолчанию.

Вы сами выбираете подчеркивания ...

6
ответ дан 23 November 2019 в 22:46
поделиться

Я нашел это в Журнале кодеров Ника Берарди , но там не было информации о том, как реализовать класс LowercaseRoute . Поэтому репост здесь с дополнительной информацией.

Сначала расширите класс Route до LowercaseRoute

public class LowercaseRoute : Route
{
    public LowercaseRoute(string url, IRouteHandler routeHandler)
        : base(url, routeHandler) { }
    public LowercaseRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
        : base(url, defaults, routeHandler) { }
    public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
        : base(url, defaults, constraints, routeHandler) { }
    public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler) : base(url, defaults, constraints, dataTokens, routeHandler) { }
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        VirtualPathData path = base.GetVirtualPath(requestContext, values);

        if (path != null)
            path.VirtualPath = path.VirtualPath.ToLowerInvariant();

        return path;
    }
}

, затем измените метод RegisterRoutes файла Global.asax.cs

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add(new LowercaseRoute("{controller}/{action}/{id}", 
        new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }), 
        new MvcRouteHandler()));

    //routes.MapRoute(
    //    "Default",                                              // Route name
    //    "{controller}/{action}/{id}",                           // URL with parameters
    //    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    //);
}

I однако хотелось бы знать способ использования routes.MapRoute ...

15
ответ дан 23 November 2019 в 22:46
поделиться

Я всегда считал форматировщик кода Vim отличным вариантом. Он поддерживает множество языков и может быть разумно настроен.

Вы можете направить соответствующие команды в vim следующим образом:

vim MyClass.java <<< gg=G:wq

Объяснение:

  • gg = G форматирует файл
  • :
21
ответ дан 23 November 2019 в 22:46
поделиться

Вы можете продолжить использование синтаксиса MapRoute, добавив этот класс в качестве расширения к RouteCollection:

public static class RouteCollectionExtension
{
    public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults)
    {
        return routes.MapRouteLowerCase(name, url, defaults, null);
    }

    public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults, object constraints)
    {
        Route route = new LowercaseRoute(url, new MvcRouteHandler())
        {
            Defaults = new RouteValueDictionary(defaults),
            Constraints = new RouteValueDictionary(constraints)
        };

        routes.Add(name, route);

        return route;
    }
}

Теперь вы можете использовать при запуске вашего приложения «MapRouteLowerCase» вместо «MapRoute»:

    public void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Url shortcuts
        routes.MapRouteLowerCase("Home", "", new { controller = "Home", action = "Index" });
        routes.MapRouteLowerCase("Login", "login", new { controller = "Account", action = "Login" });
        routes.MapRouteLowerCase("Logout", "logout", new { controller = "Account", action = "Logout" });

        routes.MapRouteLowerCase(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }
11
ответ дан 23 November 2019 в 22:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: