Маршруты ASP.NET MVC и специфичные для клиента функции - PullRequest
0 голосов
/ 27 мая 2011

Я работаю над приложением, в котором строится система, в которой несколько «клиентов» будут использовать систему, и 99,9% контроллеров / действий будут одинаковыми, просто получая разные данные, но бывают моменты и места, когдаможет потребоваться настраиваемое действие контроллера или представление.

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

routes.MapRoute(
    "Default", // Route name
    "{company}/{controller}/{action}/{id}",
    new {company = "Unknown", controller = "Home", 
    action = "Index", id = UrlParameter.Optional} 
    );

Это прекрасно работаеттак как я могу определить свои индивидуальные действия контроллера как это

public ActionResult ShowReport(string company)
{
    //Actual code goes here..
}

, у меня есть система, которая будет получать сегмент данных для этой конкретной компании и возвращать правильное представление.Так что для моей 99,9% ситуации это выглядит великолепно.То, что я ищу, - это решение для случаев, когда мне нужно визуализировать другое представление или выполнять дополнительные действия, характерные для одной компании.

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

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Для конкретной компании вы можете использовать что-то вроде этого и поставить его перед действием по умолчанию, в этом случае URL должен содержать Company1 / somethingcontroller / etc / etc.

routes.MapRoute(
    "Company1Default", // Route name
    "Company1/{controller}/{action}/{id}",
    new {company = "Company1", controller = "DefaultControllerForCompany1", 
    action = "Index", id = UrlParameter.Optional} 
    );
0 голосов
/ 27 мая 2011

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

Почему вы хотите жестко закодировать название компании в вашем global.asax?Я не думаю, что это было бы очень масштабируемым.Если вы хотите добавить поддержку для дополнительных 10 компаний, вам нужно будет создать 10 новых записей.Кроме того, что, если вы хотите изменить название компании из-за выкупа или что-то?Больше обслуживания.

Почему бы не добавить маршрут для отправки каждой компании на один контроллер, например ...

routes.MapRoute(  
    "CompanyRouting", // Route name  
    "{companyname}/{action}",  
    new { controller = "MySingleCompanyControllerName", action = "Index", companyname = UrlParameter.Optional }  
);

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

public ActionResult Index()
{
    ViewData["companynamevalue"] = RouteData.Values["companyname"];
    return View();
}

Index.aspx

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
        Requested Company Name = <%: ViewData["companynamevalue"] %>
    </div>
</body>
</html>

ПРИМЕЧАНИЕ.Справка по маршрутизации - отладчик маршрутизации Фила Хаака .

0 голосов
/ 27 мая 2011

Определить, какое представление возвращается из действия, легко:

return View("Index");

Это вернет представление с именем "Index" независимо от того, какое действие вызывается.

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

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

...