Динамическая карта сайта в ASP.NET MVC

Во-первых, давайте разберем, что делает ваш код:

  1. Создайте объект с именем file в \\abc.def.txt
  2. Распечатайте true Если объект file не null и file.exists() возвращает true
  3. Создайте объект с именем file1 в \\abc.def.txt
  4. Распечатайте true Если file1 объект не null и file.exists() возвращает true

В ответ на ваш вопрос редактирования, в Windows, начиная с \, предполагается, что Вы идете в каталог «корневого» уровня. В вашем примере это должно быть C:, если не указано иное.

Вы создаете оба файла, и ваша проверка True / False действительно проверяет, существуют ли они, а не , где они существуют. Если вы хотите проверить, где они существуют, вы можете сделать что-то вроде этого:

File file = new File("\\abc.def.txt");
boolean check = new File(directory, file).exists();
System.out.println(check); // Returns true
File file1 = new File("C:\\abc.def.txt");
boolean check1 = new File("C:\\", "abc.def.txt").exists();
System.out.println(check1); //Returns true
28
задан dp. 7 April 2009 в 23:17
поделиться

7 ответов

Я посмотрел на подход Мартена Баллиау в ответ на комментарий Ликвида, но, похоже, излишне то, что я пытаюсь делать.

Я взломал временное решение. Я просто передаю имена контроллеров и действий для генерации URL. Чтобы сгенерировать URL-адреса, я использую следующий код:

    List<string> urlList = new List<string>();
    urlList.Add(GetUrl(new { controller = "Help", action = "Edit" }));
    urlList.Add(GetUrl(new { controller = "Help", action = "Create" }));
    urlList.Add(GetUrl(new { controller = "About", action = "Company" }));
    urlList.Add(GetUrl(new { controller = "About", action = "Management" }));

, где GetUrl, как показано ниже:

    protected string GetUrl(object routeValues)
    {
        RouteValueDictionary values = new RouteValueDictionary(routeValues);
        RequestContext context = new RequestContext(HttpContext, RouteData);

        string url = RouteTable.Routes.GetVirtualPath(context, values).VirtualPath;

        return new Uri(Request.Url, url).AbsoluteUri;
    }

Пока что это помогает, хотя мне нравится идея применения actionfilter к определенным действиям, которые собраться автоматически.

6
ответ дан dp. 28 November 2019 в 03:43
поделиться

Как likwid упоминания, Вы хотите размышлять над своим пространством имен модели (моделей) и получить все классы та реализация IController. После того как у Вас есть набор, Вы хотите отразиться для наблюдения, какие участники (методы) возвращают тип ActionResult.

Возможно, можно создать собственный атрибут, [SitemapAttribute], который позволяет Вам выборочно указать что методы индексировать в карте сайта (т.е. Индекс (), но не Редактирование ()). Да, мне нравится эта идея управлять, какие методы (URL) записан.

Это - превосходный вопрос, потому что я просто думал о выполнении того же. +1!

// Controller abstract implements IController
public class HelpController : Controller
{
  public HelpController()
  {
  }

  [Sitemap]
  public ActionResult Index()
  {
    // does get written to the file, cause of [Sitemap]
  }

  public ActionResult Create()
  {
    // does not get mapped to the file
  }

  public ActionResult Edit()
  {
    // does not get mapped to the file
  }

  [Sitemap]
  public ActionResult ViewArticle()
  {
    // would get indexed.
  }
}

Поскольку, как сделать отражение, вот хорошая статья MSDN для представления Вас отражению:

http://msdn.microsoft.com/en-us/library/ms172331.aspx

Хороший вопрос!

7
ответ дан eduncan911 28 November 2019 в 03:43
поделиться

Итак, получение контроллеров и действий кажется мне относительно тривиальной частью. Сложной является возможность получить все возможные значения параметров, которые вы, возможно, захотите показать в URL-адресах вашей карты сайта. Если у вас есть шаблон URL, например, {controller} / {action} / {id} , то вы не сможете с помощью размышлений определить, что означает значение id . или возможные значения. Лучшее, что вы можете сделать, это определить тип системы.

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

abstract ActionResult SiteMapSnippet();

Затем вы можете создать SiteMapController , который вызывает каждый из других контроллеров в решении и запрашивает их фрагмент, а затем отображает их все вместе в одном конечном виде. Вроде составного контроллера, хотя это еще не концепция, которая была добавлена ​​в эту платформу.

2
ответ дан Drew Noakes 28 November 2019 в 03:43
поделиться

Имейте Вас, попробовал что-то вроде этого:

http://blog.maartenballiauw.be/post/2008/08/29/Building-an-ASPNET-MVC-sitemap-provider-with-security-trimming.aspx

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

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

0
ответ дан user88363 28 November 2019 в 03:43
поделиться

Смотрите на код позади "Отладчика Маршрута Phil Haack":

http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

-1
ответ дан defeated 28 November 2019 в 03:43
поделиться

Ниже я разместил ответ «сделай сам» . Но вот пакет, который делает это из коробки для сайтов MVC:

http://mvcsitemap.codeplex.com/ (<- старый сайт, но с обширной документацией!)

https: / /github.com/maartenba/MvcSiteMapProvider/wiki (<- перемещен на новый сайт, отсутствует документация и не так активен)

Обратите внимание, что он выполняет множество действий:

  • Регистрирует автоматически сам в маршрутах Mvc для ответа на запросы SEO /sitemap.xml (даже если для /sitemap.xml нет физического файла). Это полностью совместимо со всеми роботами поисковых систем, которые я нашел, а также с переносом, когда число достигает 10 000 и т. Д.
  • Поставляется с набором частичных представлений для использования для BreadCrumb встроенной навигации. в! Мы используем это довольно широко, хотя динамическая часть данных немного громоздка, но она работает.
  • Поставляется с набором частичных представлений для управления меню.
  • Уважает биты безопасности [Авторизовать] вашего Контроллеры и методы действий.

Все вышеперечисленные пункты управляются из единого XML-файла mvc.sitemap, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется, это действительно здорово.

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

  • Поставляется с набором частичных представлений для управления Menu.
  • Учитывает биты безопасности [Authorize] ваших контроллеров и методов действий.
  • Все вышеперечисленные пункты управляются с одного mvc. XML-файл карты сайта, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется - это действительно здорово.

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

  • Поставляется с набором частичных представлений для управления Menu.
  • Учитывает биты безопасности [Authorize] ваших контроллеров и методов действий.
  • Все вышеперечисленные пункты управляются с одного mvc. XML-файл карты сайта, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется - это действительно здорово.

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

    XML-файл карты сайта, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется, это действительно здорово.

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

    XML-файл карты сайта, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется, это действительно здорово.

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

    13
    ответ дан 28 November 2019 в 03:43
    поделиться

    Определите ActionFilterAttribute, подобный этому, чтобы поместить его на любой метод Action, который является фактической страницей, которую вы хотите перечислить в вашей карте сайта:-

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class MVCUrlAttribute : ActionFilterAttribute
    {
        public string Url { get; private set; }
    
        public MVCUrlAttribute(string url)
        {
            this.Url = url;
        }
    
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            // Put this 'canonical url' into the model (which feeds the view)
            // to help search engines with issues of duplicate content
            filterContext.Controller.ViewData["CanonicalUrl"] = url;
            base.OnResultExecuting(filterContext);
        }
    }
    

    Теперь добавьте что-то подобное в код запуска вашего глобального приложения или используйте его в коде генерации sitemap.xml:-

       // Find all the MVC Routes
        Log.Debug("*** FINDING ALL MVC ROUTES MARKED FOR INCLUSION IN SITEMAP");
        var allControllers = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(Controller)));
        Log.DebugFormat("Found {0} controllers", allControllers.Count());
    
        foreach (var controllerType in allControllers)
        {
            var allPublicMethodsOnController = controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
            Log.DebugFormat("Found {0} public methods on {1}", allPublicMethodsOnController.Count(), controllerType.Name);
    
            foreach (var publicMethod in allPublicMethodsOnController)
            {
                var mvcurlattr = publicMethod.GetCustomAttributes(true).OfType<MVCUrlAttribute>().FirstOrDefault();
                if (mvcurlattr != null)
                {
                    string url = mvcurlattr.Url;
                    Log.Debug("Found " + controllerType.Name + "." + publicMethod.Name + " <-- " + url);
                    Global.SiteMapUrls.Add(url);  //<-- your code here using url
                }
            }
        }
    

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

    5
    ответ дан 28 November 2019 в 03:43
    поделиться
    Другие вопросы по тегам:

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