2015-12-08 4 views
0

Возможно ли повторное использование контроллеров в ASP MVC? И если да, то как?Повторное использование контроллеров

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

Nested navigation

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

Нижняя панель всегда имеет те же три входа. Представления для каждой из этих записей одинаковы независимо от того, какой план выбран, хотя они отличаются друг от друга. Очевидно, что данные внутри них различны (заполняются из разных таблиц).

То есть Plan A -> Suggested Points вид такой же, как Plan B -> Suggested Points вид. Но Plan A -> Suggested Points точка зрения не совпадает с Plan A -> Accepted Points вид

Для того, чтобы сделать это с видом я намерен использовать частичный вид, поэтому те же просматривать файлы могут быть использованы повторно.

Однако, как я могу сделать эквивалент для контроллеров?

Что я хотел бы, если для URL-адресов путей, таких как: /Plana/SuggestedPoints /PlanB/SuggestedPoints

На мой взгляд, я просто хочу, чтобы Plan ссылки установить переменную, которая говорит Points взгляды, какие базы данных должен подключаться к. Какой может быть неправильный способ подумать об этом, и я подозреваю, что это несовместимо с предложением URL-адреса выше.

+0

Вы установить на те URL,? Было бы полезно также включить имя контроллера .. например, '/ Plans/A/RecommendedPoints' или'/Plans/PlanA/RecommendedPoints' ... будет ли это работать для вас? – musefan

ответ

1

Предлагаемый подход

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

Вы можете изменить файл RouteConfig.cs и наметить новый маршрут. Не забудьте добавить настраиваемый маршрут до «По умолчанию».

Что-то вроде этого:

routes.MapRoute(
    "Plans", 
    "Plans/{planName}/{action}", 
    new { controller = "Plans", action = "Index" } 
); 

// Default route here. 

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

public class PlansController : Controller 
{ 
    public ActionResult SuggestedPoints(string planName) 
    { 
     // create your view here, using the planName to get the correct data. 
    } 

    public ActionResult AcceptedPoints(string planName) 
    { 
     // create your view here, using the planName to get the correct data. 
    } 

    // etc. 
} 

Этот метод позволит URL-адресам в следующем формате:

/Plans/PlanA/SuggestedPoints, /Plans/PlanA/SuggestedPoints, /Plans/PlanB/AcceptedPoints, /Plans/PlanB/AcceptedPoints и т. Д.

ПРИМЕЧАНИЕ. Если ваши планы находятся в вашей базе данных, может оказаться более полезным использовать идентификатор для плана, но URL-адрес будет выглядеть менее дружелюбным, так что это зависит от вас.

Наконец, когда вы хотите создать свои ссылки на ваш взгляд, вы можете использовать следующее:

@Html.RouteLink("link text", "SuggestedPoints", new { controller = "Plans", planName = "PlanA" }) 

Ваш Exact Запрос

Если вы абсолютно должны использовать URL-адреса, которые вы предложили, то вы можете сделать следующее, которое требует маршрута для каждого действия, но будьте осторожны, что вам нужно будет полагаться на уникальность имен Action, чтобы убедиться, t конфликтуют с другими контроллерами ...

routes.MapRoute(
    "SuggestedPoints", 
    "{planName}/SuggestedPoints", 
    new { controller = "Plans", action = "SuggestedPoints" } 
); 

routes.MapRoute(
    "AcceptedPoints", 
    "{planName}/AcceptedPoints", 
    new { controller = "Plans", action = "AcceptedPoints" } 
); 

routes.MapRoute(
    "RejectedPoints", 
    "{planName}/RejectedPoints", 
    new { controller = "Plans", action = "RejectedPoints" } 
); 

// Default route here. 

В этом случае контроллер останется таким же, как мое первое предложение выше. Какая воля позволяет URL, как выглядит следующим образом:

/PlanA/SuggestedPoints, /PlanA/SuggestedPoints, /PlanB/AcceptedPoints, /PlanB/AcceptedPoints и т.д.

+0

Большое спасибо @musefan, я пошел с вашим предлагаемым решением, так как я не слишком суетился о точном URL. У меня есть одно наблюдение, если вы не возражаете. Навигационная панель «План» ссылается на имя плана i.e./PlanA/и т. Д., Но когда включено/Plan/PlanA/RecommendedPoints, и я нажимаю на PlanB, он принимает меня в/Plan/PlanA/PlanB. Как я могу заставить его взять меня в/Plan/PlanB ... будет ли простой «../» при этом работать? И как я могу остановить его, когда я просто планирую и нажимаю на него? –

+0

@B_D: Я думаю, вы все еще используете «ActionLink» для создания своих ссылок? Я бы предположил, что вы используете «Html.RouteLink» («текст ссылки», «Предлагаемые точки», новый {planName = «PlanA»}) 'например. Заметьте, что я использовал это раньше, поэтому не знаю, что синтаксис составляет 100%. Я также добавлю его в свой ответ для полноты. – musefan

+0

. Дайте мне знать, если он работает, пожалуйста, у меня нет возможности проверить его на данный момент. – musefan

0

Это может быть что-то вроде этого:

public class PlanController 
{ 
    public ActionResult SuggestedPoints(string plan) //or int planID 
    { 
     return View(); 
    } 
    public ActionResult AcceptedPoints(string plan) //or int planID 
    { 
     return View();  
    } 
    public ActionResult RejectedPoints(string plan) //or int planID 
    { 
     return View();  
    } 
} 

и пример URLS следующая:

/Plan/SuggestedPoints/PlanA 
/Plan/AcceptedPoints/PlanB 
Смежные вопросы