2013-08-24 1 views
3

Это приложение имеет несколько маршрутов, настроенных в RouteConfig.cs. Например, у меня есть две следующие маршруты определены:Динамический URL-адрес

routes.MapRoute(
    name: "MyPage-Demo", 
    url: "pages/page-title/demo", 
    defaults: new { controller = "Root", action = "PageDemo" } 
); 

routes.MapRoute(
    name: "MyPage", 
    url: "pages/page-title/{resource}", 
    defaults: new { controller = "Root", action = "Page", resource = UrlParameter.Optional } 
); 

Каждая страница кто-то посещает есть ссылка на «демо». Доступ к странице можно получить, посетив http://localhost/pages/page-title. Это прекрасно работает.

Когда пользователь нажимает на ссылку «demo», они перенаправляются на страницу, расположенную по адресу http://localhost/pages/page-title/demo. Это прекрасно работает.

Моя проблема - демонстрационная страница может ссылаться на сложную вложенную структуру. Структура состоит из JavaScript, css, изображений и т. Д. Содержимое, используемое для демонстрации. Ни один из этих вложенных ресурсов не найден. Тем не менее, я не уверен, как настроить мою маршрутизацию для учета этих вложенных файлов.

Я уверен, что мне нужно будет обновить действие моего контроллера PageDemo. Тем не менее, я не уверен,

а) как сделать это таким образом, который позволит различных структур и

б) как обновить конфигурацию маршрута с учетом этих вложенных структур.

Есть ли способ сделать это? На самом деле, у меня будет несколько страниц и несколько демонстраций. По этой причине я хочу иметь что-то более многоразовое, чем жесткий код.

+0

Вы делаете маршрутизации для статического содержимого, такого как JS, CSS и т.д.? –

+0

Ненавижу говорить об этом, но я не уверен. По сути, каждый PageDemo будет иметь свою собственную уникальную структуру JS/Images/css и т. Д. Pagedemo всегда будет статическим HTML. По этой причине я бы сказал, что контент статичен, но я не уверен в самом маршруте. Я имею в виду? – user70192

+0

Простите, я не понимаю, что вы говорите. Когда я посещаю /pages/page-title/demo/index.html, есть ссылка на файл JavaScript. Эта ссылка - «resources/javascript/index.html.js». Однако index.html не может найти этот файл. Ссылка на «resources/javascript/index.html.js» возвращает значение 404. – user70192

ответ

2

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

routes.IgnoreRoute("pages/page-title/demo/resources/{*resource}"); 

Это обойдет MVC пытается направить запрос к контроллеру.

Или вы могли бы пойти на расширение файла:

routes.IgnoreRoute("{file}.js"); 
routes.IgnoreRoute("{file}.css"); 

(код не тестировался, но, похоже, что вы пытаетесь сделать что-то подобное здесь :) https://stackoverflow.com/a/3112192/486620

+0

лично, я никогда не видел символ «*», который использовался ранее на маршруте. Сегодня мне придется попробовать этот подход. Однако, если это делает то, что, как я думаю, будет, у нас должен быть победитель! – user70192

+0

не работал. im not sure wht подробности я могу предоставить – user70192

+0

Проделав некоторое тестирование, я не уверен, почему у вас проблемы. У меня нет проблем с доступом к файлам css/js, хранящимся в '% projectroot%/pages/page-title/demo/resources'. Вы пытаетесь указать«% projectroot%/Content/pages/page-title-demo/resources »или что нибудь? –

0

Как вы вашу JS и CSS-файлы?

Если вы используете символ тильды, как: ~/Content/Styles/Site.css, у вас не будет проблем независимо от того, где вы находитесь на своем виртуальном пути.

1

В Browser, Щелкните правой кнопкой мыши Демонстрационная страница => Выберите View Page Source.

Здесь у вас есть ссылка на CSS и Js файлов на странице Демо. Нажмите на эти ссылки js/css. Проверьте, перенаправлены ли вы в правильное/ожидаемое место.В противном случае вы могли бы сделать Css/Js файл URL соответственно Потому что, как на демо-странице каждый PageDemo будет иметь свою собственную уникальную структуру JS/Images/CSS и т.д.

2

IF I понять:

проблема, кажется, что ваш MyPage-Demo маршруту:

routes.MapRoute(
    name: "MyPage-Demo", 
    url: "pages/page-title/demo", 
    defaults: new { controller = "Root", action = "PageDemo" } 
); 

является NOT{resource} конкретных, в то время как ваш MyPage маршрут IS.

Если вы изменить свой маршрут, чтобы принять {resource}

routes.MapRoute(
    name: "MyPage-Demo", 
    url: "pages/page-title/demo/{resource}", 
    defaults: new { controller = "Root", 
     action = "PageDemo", resource = UrlParameter.Optional }); 

Тогда ваш метод действия может

  1. возвратных конкретные соображения, правильными настройки ресурсов
  2. установить свойство Viewbag с путем к вашему конкретному ресурс

Если это рядный с намерением, эти маршруты могут быть объединены в

routes.MapRoute(
    name: "MyPage-Demo", 
    url: "pages/{action}/{resource}", 
    defaults: new { controller = "Root", 
     action = "PageDemo", resource = UrlParameter.Optional }); 
  1. /pages/PageDemo/{resource} ПОСТАНОВЛЯЕТ Controller=pages, action = PageDemo
  2. /pages/demo/{resource} решает Controller=pages, action = demo.

Это соглашение позволяет Вам гибкость, чтобы создать больше {resource} зависимые ссылки

0

Также не 100% уверен, что я прямо отвечаю на ваш вопрос, но сделать предположение о том, что ресурсы, которые вы пытаетесь получить доступ вложены в папку структура, которая отражает структуру страницы - и проблема, с которой вы сталкиваетесь, заключается в том, как игнорировать маршруты к ним, не зная, что они могут быть заранее?

Это делает хорошую работу, объясняя, что: https://stackoverflow.com/a/30551/1803682

Я хотел бы спросить:

  1. Как @PKKG отмечает в своем ответе - сделать ссылки в матче источника страницы, что вы ожидаете?
  2. Каким образом предоставляется этот доступ для каждого демонстрационного контента: например, службой, а не статическим файлом?
0

Этот ответ содержит два подхода. второй может быть более подходящим для вашего сценария.первый может быть более подходящим для общего Mvc проекта

подход один

я предлагаю создать организованную структуру в папку содержимого для хранения скриптов и CSS файлы, т.е.

/Content/Demos/Page-Title-1/ 
/Content/Demos/Page-Title-2/ 
/Content/Demos/Page-Title-3/ 

и

/Content/Demos/Common/ 

, а затем создайте связку, чтобы отобразить сценарии и файлы css для каждого заголовка страницы

т.е.

bundles.Add(new StyleBundle("~/Demo/page-title/css").Include(
      "~/Content/Demos/Page-Title-1/csscontent1.css", 
      "~/Content/Demos/Page-Title-1/csscontent2.css", 
      "~/Content/Demos/Page-Title-1/csscontent3.css", 
      "~/Content/Demos/Page-Title-1/csscontent4.css")); 

bundles.Add(new StyleBundle("~/Demo/page-title/js").Include(
     "~/Content/Demos/Page-Title-1/jscontent1.css", 
     "~/Content/Demos/Page-Title-1/jscontent2.css", 
     "~/Content/Demos/Page-Title-1/jscontent3.css", 
     "~/Content/Demos/Page-Title-1/jscontent4.css")); 

Это позволит вам визуализировать сценарии на демонстрационной странице с использованием нескольких линейных подходов, т.е.

@Styles.Render("~/Demo/page-title/css"); 
@Scripts.Render("~/Demo/page-title/jss"); 

@Styles.Render("~/Demo/common/css"); 
@Scripts.Render("~/Demo/common/css"); 

вам придется обновить файлы в глобальной .asax, как вы измените файлы в/Content/Demos/Page-Title/папку. есть преимущество, которое, если вы выберете, вы можете связать и минимизировать файлы, чтобы сэкономить пропускную способность и время загрузки для загрузки первой страницы.


подход два.

(до сих пор использует следующую структуру папок

/Content/Demos/Common/ 

и

/Content/Demos/Page-Title-1/ 
/Content/Demos/Page-Title-2/ 
/Content/Demos/Page-Title-3/) 

сделать HTML-помощник для ссылки всех скриптов & содержимого в папке

его использование будет @ Asset.RenderAssets ('~/folderdirectory')

и помощник будет делать что-то вроде

@helper RenderAssets (stirng directory){ 

@* scrape the directory for all script files* 
var scripts = find all scripts in the directory 

@* include the script files *@ 
for each script 
    <script src=" ... .js"></script> 


@* scrape the directory for all cssfiles* 
var styles = all css in the directory 

@* include the css files *@ 
for each style 
<link rel='stylesheet' type="text/css" href=" ... .css"> 

} 

это было бы несколько использования линии в каждом демо зрении

@Asset.RenderAssets('~/Content/Demos/Common') 
@Asset.RenderAssets('~/Content/Demos/Page-Title') 

вы можете или не можете понадобиться пара это с несколькими дополнительной линией или два в вашем global.asax или RouteConfig.cs файл (см источник 3)

routes.IgnoreRoute("/Content/Demos/{page}/{script}.js"); 
routes.IgnoreRoute("/Content/Demos/{page}/{style}.css"); 

актуальны так urces для создания HTML хелперы см http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

использовать пакетирование и minifcation (в scripts.render подход) см http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification

Phill haakk говорит не нужно соединить это с игнорированием маршрута! https://stackoverflow.com/a/30551/1778606

комментарии и исправления приветствуются.

+0

/Содержимое уже игнорируется для статического контента – Softlion

0

Весь статический контент (.js, .css, .html, .png) не рассматривается MVC (если только модули/runAllManagedModulesForAllRequests не равны true в web.config). Статические расширения контента определены в конфигурации IIS «сопоставление модулей» и используются модуль StaticFileHandler (а не модуль .NET).

Таким образом, статический контент должен ссылаться на его физический путь относительно текущего пути (путь к текущей странице html).

Лучшее решение - использовать абсолютную ссылку из корня веб-сайта. Как /content/demo1/demo1.html, поместите все js, css в/content/demo1 /, а в demo1.html используйте путь относительно папки/content/demo1/(где находится .html). Т.е.: demo1.css находится в одной папке.

Ссылка на demo1.html будет demo 1

Смежные вопросы