В данной статье я покажу как можно использовать два подхода для обработки запроса в одном приложении ASP.NET. Для демонстрации воспользуемся готовым проектом, который был создан и описан в
данной статье. Скачиваем проект, распаковываем его и открываем в Visual Studio.
При помощи менеджера пакетов NuGet устанавливаем сборки MVC 4.
Копируем некоторые разделы конфигурации корневого файла Web.config приложения MVC 4 в корневой файл Web.config, нашего приложения Web Forms 4.5. Первая секция, находящаяся в элементе <system.web>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
</namespaces>
</pages>
и вторая
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
котрорая находится в элементе <configuration>. Создаём каталоги Views, Home
и копируем туда полностью файл Web.config из проекта MVC 4. Поскольку студия не даёт возможности вставки страницы Razor, делаем это вручную. Открываем папку Home в проводнике Windows, создаём пустой файл с раширением cshtml и именем Index. Добавляем его к проекту как существующий файл и вставляем туда следующее содержимое.
<!DOCTYPE html>
<html lang="en">
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<ul>
<li>@Html.ActionLink("MVC", "Index", "Home")</li>
<li><a href="WebForm/1" >Web Form</a></li>
</ul>
</body>
</html>
Создаём папку Controllers и помещаем туда простой класс.
using System.Web.Mvc;
namespace TestWebApi.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Title = "Обработка запроса с помощью MVС.";
return View();
}
}
}
Прописываем соответствующие маршруты в файл Global.asax
namespace TestWebApi
{
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("DefaultForm", "WebForm/{id}", "~/WebForm.aspx");
routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional });
routes.MapRoute(name: "DefaultMvc", url: "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index", id = UrlParameter.Optional });
}
}
}
Приложение готово, компилируем и запускаем его. Переходим по ссылкам и видим, что всё работает. Т.е. используя маршрутизацию и обработчики Web Forms, MVC и Web API (хотя последня это тоже шаблон MVC) мы объединили методы обработки запросов в одном приложении. Есть конечно некоторые подводные камни с разделением некоторых внутренних объектов приложения, но об этом в другой раз.
Целью данной статьи была демонстрация того, что было написано
тут и
тут. Особенно это полезно, для многих разработчиков, которые вроде бы имеют достаточный опыт, но смутно представляют с чем имеют дело и удивляются подобным вещам. Платформа ASP.NET - одна. Web Forms и MVC - просто разные подходы обработки запросов, которые начинаются с обработчика маршрута и обработчика HTTP-данных. Есть платформа, есть несколько подходов, значит есть возможность выбора, что всегда хорошо. Сравнивать и разводить холивары, на счёт того, что лучше не имеет смысла. Каждый инструмент имеет свои достатки и недостатки в зависимости от поставленной задачи, но в умелых руках, иначе все его преимущества сведутся на нет. А
вот и ссылка на готовый проект.