Создание частичного представления внутри фабрики

#c# #.net #asp.net-mvc

#c# #.net #asp.net-mvc

Вопрос:

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

     [HttpGet]
    public PartialViewResult GetQueryItemForCategory(string categoryName, bool campaignSelected)
    {
        return QueryItemBuilderFactory.BuildPartial(categoryName, campaignSelected);
    } 
  

Но я действительно не могу вызвать метод PartialView() внутри этой фабрики.

 public static class QueryItemBuilderFactory
{
    private static Dictionary<string, Func<bool, PartialViewResult>> _builderActions =
        new Dictionary<string, Func<bool, PartialViewResult>>();
    static QueryItemBuilderFactory()
    {
        _builderActions.Add("Data Field", campaignSelected =>
                                            {
                                                return  PartialView("_DataFieldQueryItemPartial");
                                            });
    }

    public static PartialViewResult BuildPartial(string categoryName, bool campaignSelected)
    {
        return _builderActions[categoryName](campaignSelected);
    }
}
  

Есть ли какой-нибудь способ его реализовать?

Ответ №1:

Защищенные PartialView методы определены в базовом Controller классе:

 public abstract class Controller : ControllerBase, IActionFilter,
    IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter
{
    ...

    protected internal PartialViewResult PartialView()
    {
        ...
    }

    protected internal PartialViewResult PartialView(object model)
    {
        ...
    }

    protected internal PartialViewResult PartialView(string viewName)
    {
        ...
    }

    ...
}
  

Таким образом, наследование от этого Controller класса позволяет использовать этот метод, тогда как в других ситуациях он недоступен.
Однако, как вы можете видеть PartialView , методы возвращают PartialViewResult объекты, заменяя

 return PartialView("_DataFieldQueryItemPartial");
  

в вашем примере с

 return new PartialViewResult(){ ViewName = "_DataFieldQueryItemPartial" };
  

сделает свое дело.

Ответ №2:

Класс ‘PartialViewResult’ наследует класс ‘ViewResultBase’. Класс ‘ViewResultBase’ имеет требуемые свойства и методы для настройки нового типа представления. Будьте осторожны при объявлении типа объекта.

Ответ №3:

вызов PartialView фактически возвращает только объект PartialViewResult . Вы можете создать новый PartialViewResult где угодно. Итак, вы можете создать свой собственный метод быстрого доступа FactoryPartialView() на вашем базовом контроллере, который будет использовать ваш factory вместо оператора «new» для создания PartialViewResult.