Asp.net MVC метод RenderAction в нескольких контроллерах - PullRequest
2 голосов
/ 26 августа 2011

Я выполняю некоторые виды плагинов, используя asp.net mvc. У меня есть два плагина (проекты MVC), скажем, пользователи и дома. В обоих плагинах у меня есть Home Controllers. Да, названия домашних контроллеров в обоих плагинах (проектах). Когда я собираю проект, Dll копируются в хост-проект (третий).

это домашний плагин

namespace Plugin.Home.Controllers
{
public class HomeController : Controller
{
    public string Index()
    {
        return "Home from home";
    }

    public string JustATest()
    {
        return "Just a test from home";
    }

}
}

Вот еще один контроллер в другом проекте (плагин пользователя)

это домашний контроллер

namespace Plugin.Users.Controllers
{
public class HomeController : Controller
{
    public string Index()
    {
        return "Home from Users";
    }

    public string JustATest()
    {
        return "Just a test from Users";
    }

    public string JustAnotherTest()
    {
        return "Just another test from Users";
    }

}
}

В global.asax я регистрирую маршруты, используя пространства имен.

routes.MapRoute(
        "Default", // Route name
        "Home/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },     
 new[] { "Plugin.Home.Controllers" }

routes.MapRoute(
           "Users", // Route name
           "users/{action}/{id}", // URL with parameters
           new { controller = "Home", action = "Index", id = UrlParameter.Optional },     new[] { "Plugin.Users.Controllers" }
       );

Я могу получить доступ ко всем маршрутам в браузере без каких-либо проблем.

Теперь проблемы

  1. Я пытаюсь использовать @ {Html.RenderAction ("JustATest", "Home");} Это только отдает от домашнего контроллера в домашнем модуле. Как я могу сделать это из модуля «Пользователи».

  2. Выдает исключение, говоря, что метод не найден в домашнем контроллере, когда я говорю @ {Html.RenderAction ("JustAnotherTest", "Home");}

На каком этапе я могу проверить, есть ли у данного контроллера данный метод или нет (Some ControllerFactory). Или как я могу убедиться, что он подбирает правильный контроллер.

Помощь будет оценена.

Привет

Parminder

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Если вам действительно нужно сохранить имена контроллеров и HomeController, я вижу простое решение для использования хака, например:

routes.MapRoute(
        null,
        "{home}/{action}/{id}", 
        new { controller = "Home", action = "Index", home="Home", id = UrlParameter.Optional });
routes.MapRoute(
        null,
        "{home}/{action}/{id}", 
        new { controller = "Home", action = "Index", home="Users", id = UrlParameter.Optional }
       );

И вы можете получить доступ к этим действиям как по URL, так и с помощью RenderAction:

@{Html.RenderAction("JustATest","Home", new {home="Home"});}
@{Html.RenderAction("JustATest","Home", new home="Users");}

Но я думаю, что проблема искусственная (потому что это сложнее, чем вы себе представляете), и вы используете средства только для использования средств, но не для решения реальной проблемы.Для реальной архитектуры плагинов вам необходимо создать как минимум: 1. Пользовательское ограничение маршрута для проверки того, что тип контроллера относится к сборке, где был определен контроллер.2. Установщик, который установит все маршруты независимо от основного приложения. 3. Создайте модульные тесты для каждого приложения плагина. Маршруты, чтобы убедиться, что все маршруты, установленные из плагинов, которые ничего не знают друг о друге, работают должным образом (и нене ломайте друг друга).

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

0 голосов
/ 26 августа 2011

См. Формат, используемый здесь:

рендер действие с лямбда

@Html.RenderACtion<Plugin.Home.Controllers.HomeController>(...)

Edit

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

Как добиться динамического контроллера и метод действия в ASP.NET MVC?

...