Что лучший способ состоит в том, чтобы назвать a Response.Redirect
в шаблоне Образцового Предъявителя Представления при соблюдении для исправления разделения уровня?
Один из способов, которым я обрабатывал, это для презентабели поднять событие (вроде успешно
или что-то), чтобы представление подписалась на. Когда ведущий закончил свою обработку, он будет поднять событие, которое будет обрабатываться по мнению. В этом обработке представление будет перенаправлять на следующую страницу.
Таким образом, ведущий не нужно ничего знать о страницах или URL или что-то. Он просто знает, когда он завершил свою задачу и дает представлению знать, поднимая событие. Вы можете поднять разные события, если презентатер успел или потерпел неудачу, если вам нужно перенаправить в разные места.
Как мы делаем, это хорошо работает, как только некоторые наземные работы заложены. Я уверен, что есть несколько способов кожи кота, хотя. (Кто все равно скинки кошек. Кошки милые и приятные!)
Во-первых, это будет работать только на ASP.NET Compabled веб-проектам, а не на веб-сайтах.
Каждая страница должна наследовать от пользовательского абстрактного базового класса, который выглядит что-то подобное:
public abstract class PageBase : Page
{
private static string _baseUrl = "/";
public static string BaseUrl
{
get { return _baseUrl; }
set { _baseUrl = value; }
}
protected static string BuildUrl(string basePath)
{
if( !string.IsNullOrEmpty(basePath) && basePath.StartsWith("~/"))
{
basePath = basePath.replace("~/", BaseUrl);
}
return basePath;
}
protected static string LoadView(string path)
{
Response.Redirect(path);
}
}
Каждая страница также реализует интерфейс специфичного страниц. Каждый конкретный интерфейс страницы также наследует из базового интерфейса:
public interface IPageBase()
{
void LoadView(string path);
}
, то это вопрос каждой страницы, определяющей свою собственную версию BaseURL. Возможно, вы захотите объяснить запросы / шифрование PATH / ETC.
Наконец, любая из ваших докладчиков (которые должны ссылаться на определенные интерфейсы на странице), могут захватить статическое buildurl () на нужную страницу для просмотра, а затем вызовов loadview () с возвращенным путем.
Это зависит от того, насколько общие ваши ведущие. Если ваши ведущие являются полностью UI Agnostic (могут быть повторно использованы между WinForms и WebForms), то вам придется абстрактные операции по перенаправлению. В веб-формах операция по перенаправлению будет реализована с помощью ответа. В WinForms (я отказываюсь от многих опытов с WinForms), я предполагаю, что он будет реализован по мере того, как uverform.show.
Один простой, внеупонечный вариант My-Head будет включать в интерфейс View A ShowViewx (). Вы можете иметь один для каждой формы, представление может логически перенаправить. В качестве альтернативы, представление может реализовать метод интерфейса, такого как Show (ondingViews), где ondingViews - это enum, который включает в себя значение для каждой из представлений, которые могут быть «перенаправлены» с определенного представления. Этот Enum будет жить на уровне докладчика.
Вышеуказанные подходы специфичны для просмотра - презентаторы. Вместо этого вы могли бы реализовать его как системную массу. Логика будет аналогична выше, реализована в базовом представлении и ведущей. Там будет ShowView __ () для каждой формы, или в Show (Views) метод, где представления - это enum всех форм.
Это подбрасывание между инкапсуляцией и сухой.
Я не знаю, является ли это самым правильным способом, концептуально.
Но то, что я сделал в своих последних MVP-приложениях, это создал обертку вокруг HttpContext.current
, которую я назвал HttpRedirector.
Я также создал фиктивный редиректор для тестовых целей. Оба они отслеживают последний перенаправленный url, чтобы я мог проверить в своих юнит-тестах, что перенаправление на самом деле произошло, когда я вызываю метод на своем контроллере/представителе. С помощью IOC-контейнера я могу переключить реализацию IRedirector
на основе среды (производство/тестирование).