.NET MVC инстанцирует контроллера в другом контроллере

Внедрение зависимости является вырожденной формой неявная передача параметров , и целью является по существу то же, для решения то, что звонило проблема Конфигураций :

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

платформы Внедрения зависимости компенсируют из-за отсутствия неявные параметры , функции С приправой карри , и удобные средства для монады на языке.

7
задан DaveRandom 25 February 2013 в 20:06
поделиться

3 ответа

Дон не использовать eval. Вы можете получить ссылку на именованную глобальную переменную или функцию из объекта window :

var callbackfunction= window[json.callback.callbackName];

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

callbackfunction.call(window, json.callback.callbackParams.param1, json.callback.callbackParams.param2);

( window здесь фиктивное значение для this , когда вы не используете методы объекта. Если вы смотрите на шаблон FrontController, вам следует изучить возможность написания Custom ControllerFactory, который наследуется от DefaultControllerFactory, а затем переопределить метод CreateController. Вы можете зарегистрировать свою фабрику, используя приведенный ниже код.

    protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory();
        RegisterRoutes(RouteTable.Routes);
    }

На фабрике контроллеров у вас есть доступ к RequestContext, так что вы можете изменить RouteData по мере необходимости и передать права на правильный контроллер.

Вы, конечно, можете просто установить собственный маршрут для Home / Index, который идет к OtherController.ShowNumberOfThings ()

routes.MapRoute("Home", "Home/Index/{id}",
                            new {controller = "Other", action = "ShowNumberOfThings", id = 100});
2
ответ дан 7 December 2019 в 10:04
поделиться

Если вы хотите, чтобы при нажатии на действие «Индекс» вам отображалось «Количество вещей: 100», почему бы напрямую не визуализировать соответствующее представление:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View("~Views/Other/ShowNumberOfThings.aspx", 100);
    }
}
3
ответ дан 7 December 2019 в 10:04
поделиться

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

вместо ~ Views / Other / ShowNumberOfThings.aspx

, вы можете поместить свое представление в ~ Views /shared/ShowNumberOfThings.ascx

иметь оба представления ~ Views / Other / ShowNumberOfThings.aspx и ~ Views / Home / Index.aspx реализуют частичное представление

public class HomeController : Controller
{
    public ActionResult Index()
    {
            return View(100);
    }
}

public class OtherController : Controller
{
        public ActionResult ShowNumberOfThings(int index)
        {
            return View(index);
        }
}

и в оба представления реализуют частичное представление

<% Html.RenderPartial("~Views/shared/ShowNumberOfThings.ascx", ViewData.Model); %>

, вы можете изменить int для любого объекта, который будет передан в модель

1
ответ дан 7 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

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