asp.net mvc сложная маршрутизация для древовидного пути

На стороне сервера вы можете использовать метод deasync sleep(), который изначально реализован в C , поэтому он может эффективно реализовать эффект wait без блокирование цикла событий или загрузка процессора на 100%.

Пример:

#!/usr/bin/env node

// Requires `npm install --save deasync`
var sleep = require("deasync").sleep;

sleep(5000);

console.log ("Hello World!!");

Но если вам нужна javascript-функция pure (например, для запуска ее на стороне клиента через браузер), извините скажем, я думаю, что ваша функция pausecomp() - единственный способ приблизиться к ней, и, более того:

  1. Это приостанавливает не только вашу функцию, но и весь цикл обработки событий. Таким образом, никакие другие события не будут посещены.

  2. Он загружает ваш процессор на 100%.

Итак, если вам это нужно для сценария браузера и вы не хотите этих ужасных эффектов, я должен сказать, что вы должны переосмыслить свою функцию таким образом:

a). Вы можете вспомнить его (или вызвать функцию do_the_rest()) по истечении времени ожидания. Более простой способ, если вы не ожидаете какого-либо результата от своей функции.

[+1121] б). Или, если вам нужно дождаться результата, вам следует перейти к использованию обещаний (или, конечно же, к обратному вызову; -)).

Пример, ожидаемый результат:

function myFunc() {

    console.log ("Do some things");

    setTimeout(function doTheRest(){
        console.log ("Do more things...");
    }, 5000);

    // Returns undefined.
};


myFunc();

Пример возврата обещания (обратите внимание, что это меняет использование вашей функции):

function myFunc(someString) {

    return new Promise(function(resolve, reject) {

        var result = [someString];
        result.push("Do some things");

        setTimeout(function(){
            result.push("Do more things...");
            resolve(result.join("\n"));
        }, 5000);

    });

};


// But notice that this approach affect to the function usage...
// (It returns a promise, not actual data):
myFunc("Hello!!").then(function(data){
    console.log(data);
}).catch(function(err){
    console.error(err);
});

12
задан tereško 20 February 2013 в 21:26
поделиться

4 ответа

Для этого вы можете создать собственный обработчик маршрута. Фактический маршрут является универсальным:

routes.MapRoute(
    "Tree",
    "Tree/{*path}",
    new { controller = "Tree", action = "Index" })
        .RouteHandler = new TreeRouteHandler();

Обработчик дерева смотрит на путь, извлекает последнюю часть как действие, а затем перенаправляет на контроллер. Часть действия также удаляется из пути. Добавление части {id} должно быть простым.

public class TreeRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string path = requestContext.RouteData.Values["path"] as string;

        if (path != null)
        {
            int idx = path.LastIndexOf('/');
            if (idx >= 0)
            {
                string actionName = path.Substring(idx+1);
                if (actionName.Length > 0)
                {
                    requestContext.RouteData.Values["action"] = actionName;
                    requestContext.RouteData.Values["path"] = 
                        path.Substring(0, idx);
                }
            }
        }

        return new MvcHandler(requestContext);
    }
}

После этого ваш контроллер будет работать так, как вы ожидаете:

public class TreeController : Controller
{
    public ActionResult DoStuff(string path)
    {
        ViewData["path"] = path;
        return View("Index");
    }
}

Теперь вы можете вызвать URL-адрес вида / Tree / Node1 / Node2 / Node3 / DoStuff . Путь, который получает действие: Узел1 / Узел2 / Узел3

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

Можете ли вы переключить URL? Если вы можете сделать свой параметр {TreePath} последним параметром, вы можете легко сделать это с помощью одного маршрута.

   routes.MapRoute("TreeRoute", 
                    "{Action}/{id}/{*TreePath}", 
                    new TreeRouteHandler()));

Параметр catchall с подстановочными знаками должен быть последним параметром.

В противном случае, я думаю, вы » Мне придется определять несколько параметров, по одному для соответствия каждому возможному разделу URL-адреса TreeMap.

Обратите внимание, что вы никогда не сможете определить два параметра маршрутизации вместе без некоторого буквального текста между ними. Другими словами, вы можете определить {Action} / {Id} , но вы можете никогда не определять {Action} {Id} . Механизм маршрутизации не может знать, где заканчивается один параметр и начинается следующий при сопоставлении с образцом.

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

Я новичок в MVC, но одним из требований был этот вариант. Я vb-er, поэтому у меня возникли проблемы с преобразованием кода, но я заставил его работать и хотел внести пример решения: www.proovit.com/Download/MvcApplication1.zip Это простой стандартный проект MVC, я оставил каталоги кода и bin, но вы можете скопировать их из стандартного проекта.

o, вы должны использовать теги app / bla / bla / bla для индекса и app / сделка / заказ / просмотр для страницы заказа.

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

У вас может быть «жадная» часть в строке запроса, если после нее могут быть фиксированные части, например

/{*TreePath}/Edit/{id}
/{*TreePath}/Action/{id}

Обратите внимание, что действие не является переменным в указанных выше маршрутах, потому что жадный части должны останавливаться на каком-то буквальном значении (кроме косой черты). Я буду работать, если вы выполняете только несколько действий в своем «дереве», но будет обременительным, если у вас много действий, поскольку для каждого из них потребуется собственная запись маршрута.

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

2
ответ дан 2 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

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