ASP.NET MVC маршрутизация вопроса

Я не думаю, что вам нужно created_at в вашем SELECT, чтобы получить желаемые результаты. Вы должны иметь возможность просто упростить запрос:

$concerns = DB::table('concerns')
    ->select(DB::raw('MONTHNAME(created_at) as month, count(*) as total'))
    ->whereBetween('created_at', [$start, $end])
    ->groupBy('month')
    ->orderBy('created_at', 'asc')

Обратите внимание, что предполагается, что между $start и $end не более 12 месяцев. В противном случае вам также необходимо сгруппировать по YEAR(created_at).

Если вы используете MySQL 8, или only_full_group_by включен, вам нужно будет приложить больше усилий, чтобы получить действительный запрос, отвечающий требованиям для GROUP BY. Это должно работать:

$concerns = DB::table('concerns')
    ->select(DB::raw('MONTHNAME(created_at) AS month, YEAR(created_at) AS year, count(*) as total'))
    ->whereBetween('created_at', [$start, $end])
    ->groupBy('year', 'month')
    ->orderBy('year', 'asc')
    ->orderByRaw("MONTH(STR_TO_DATE(CONCAT('1 ', month, ' ', year), '%e %M %y')) asc")

Я сделал демо этого запроса, работающего над dbfiddle

13
задан p.campbell 23 September 2009 в 22:29
поделиться

6 ответов

Что относительно

routes.MapRoute(
    "Profiles",
    "{userName}",
    new { controller = "Profiles", action = "ShowUser" }
);

и затем, в ProfilesController, была бы функция

public ActionResult ShowUser(string userName)
{
...

В функции, если никакой пользователь с указанным именем пользователя не найден, необходимо перенаправить к значению по умолчанию {контроллер} / {действие} / {идентификатор} (здесь, это было бы просто {контроллер}), маршрут.

URL как www.twitter.com/login должны быть зарегистрированы перед тем.

routes.MapRoute(
    "Login",
    "Login",
    new { controller = "Security", action = "Login" }
);
10
ответ дан 2 December 2019 в 00:32
поделиться

Важная вещь понять состоит в том, что маршруты подобраны в порядке, они регистрируются. Таким образом, необходимо было бы зарегистрировать самый определенный маршрут сначала, и самое общее последнее, или все запросы, соответствующие общему маршруту, никогда не будет достигать уточненного маршрута.

Для Вашей проблемы я зарегистрировал бы правила маршрутизации для каждой из специальных страниц, как "регистр" и "вход в систему" перед правилом имени пользователя.

4
ответ дан 2 December 2019 в 00:32
поделиться

Вы могли обработать это в домашнем контроллере, но метод контроллера не будет очень изящен. Я предполагаю, что что-то вроде этого могло бы работать (не протестированный):

routes.MapRoute(
    "Root",
    "{controller}/{view}",
    new { controller = "Home", action = "Index", view = "" }
);

Затем в Вашем HomeController:

public ActionResult Index(string view) {
    switch (view) {
        case "":
            return View();

        case "register":
            return View("Register");

        default: 
            // load user profile view
    }
}
0
ответ дан 2 December 2019 в 00:32
поделиться

Хорошо я правильно никогда не пробовал это, но имею Вас, пытался расширить класс RouteBase для контакта с пользователями. Документы для RouteBase предполагают, что метод, GetRouteData должен возвратить пустой указатель, если он не соответствует текущему запросу. Вы могли использовать это, чтобы проверить, что запрос соответствует одним из имен пользователей, которые Вы имеете.

Можно добавить использование подкласса RouteBase:

  routes.Add(new UserRouteBase());

Когда Вы регистрируете маршруты.

Могло бы стоить исследовать.

0
ответ дан 2 December 2019 в 00:32
поделиться

Думаю, ваш вопрос похож на мой. ASP.NET MVC Routing

- вот что ответил Роберт Харви .

routes.MapRoute( _
    "SearchRoute", _
    "{id}", _
    New With {.controller = "User", .action = "Profile", .id = ""} _

)

0
ответ дан 2 December 2019 в 00:32
поделиться

Альтернативный способ регистрации стандартного маршрута:

1. Загрузите RiaLibrary.Web.dll и укажите его в своем проекте веб-сайта ASP.NET MVC

2. Декорировать методы контроллера с помощью атрибутов [Url]:

public SiteController : Controller
{
    [Url("")]
    public ActionResult Home()
    {
        return View();
    }

    [Url("about")]
    public ActionResult AboutUs()
    {
        return View();
    }

    [Url("store/{?category}")]
    public ActionResult Products(string category = null)
    {
        return View();
    }
}

BTW, '?' Войти в параметр '{? category}' означает, что он необязательный. Вам не нужно явно указывать это в параметрах маршрута по умолчанию, что равно следующему:

routes.MapRoute("Store", "store/{category}",
new { controller = "Store", action = "Home", category = UrlParameter.Optional });

3. Обновить файл Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoutes(); // This do the trick
    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

Как установить значения по умолчанию и ограничения? Пример:

public SiteController : Controller
{
    [Url("admin/articles/edit/{id}", Constraints = @"id=\d+")]
    public ActionResult ArticlesEdit(int id)
    {
        return View();
    }

    [Url("articles/{category}/{date}_{title}", Constraints =
         "date=(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")]
    public ActionResult Article(string category, DateTime date, string title)
    {
        return View();
    }
}

Как установить порядок? Пример:

[Url("forums/{?category}", Order = 2)]
public ActionResult Threads(string category)
{
    return View();
}

[Url("forums/new", Order = 1)]
public ActionResult NewThread()
{
    return View();
}
0
ответ дан 2 December 2019 в 00:32
поделиться
Другие вопросы по тегам:

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