#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.