Программные приложения ASP.NET MVC
Цель лабораторной работы
Целью лабораторной работы является изучение архитектурного шаблона MVC.
Программные приложения ASP.NET MVC
Веб-приложения – это клиент-серверные программные приложения, в которых средой исполнения для клиента является веб-браузер, а для серверной части – веб-сервер. В своей работе веб-приложения используют стандарты консорциума W3C, средства передачи данных сети Интернет.
Для создания веб-приложений с использованием архитектурного шаблона MVC используется шаблон ASP.NET Web Application среды Microsoft Visual Studio Express.
Рисунок 1
Программное приложение MVC состоит из трех основных частей:
1. Набор классов-контроллеров, реализующих логику программного приложения и обрабатывающих HTTP запросы, отправляемые интернет-браузером клиента.
2. Набор представлений, содержащих реализацию интерфейса предметной области.
3. Модель данных (может подключаться как отдельная библиотека классов).
Рисунок 4
При поступлении нового запроса объектом класса MvcApplication определяется класс-контроллер и его метод, ответственный за обработку. Определение происходит при помощи схемы URL-адресов, определенной в файле App_Start\RouteConfig.cs:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
При выполнении HTTP GET запроса по URL-адресу http://localhost:36803/Account/Register и согласно приведенному выше файлу для обработки запроса будет выбран контроллер Account и его метод Register (при определении контроллера из его имени исключается окончание *Controller).
namespace WebUI.Areas.Admin.Controllers
{
[Authorize(Roles = "admin")]
public class PageTextAdminController : Controller
{
IGenericRepository<PageText> textRepository;
public PageTextAdminController(IGenericRepository<PageText> textRepository)
{ this.textRepository = textRepository; }
public ActionResult Index()
{
var items = textRepository.GetAll();
return View(items);
}
[HttpGet]
public ActionResult Create()
{
return RedirectToAction("Edit");
}
[HttpGet]
public ViewResult Edit(int? id)
{
ViewBag.ArticleId = id ?? 0;
var article = (id == null) ? new PageText() : textRepository.GetAll().Where(x => x.Id == id).FirstOrDefault();
return View(article);
}
[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(PageText text)
{
if (ModelState.IsValid)
{
byte[] txtfile = null;
txtfile = ExtensionsCollection.GetFileContents("File0", Request);
if (text.Id == 0)
{
textRepository.Add(text);
textRepository.Save();
}
else
{
textRepository.Edit(text);
textRepository.Save();
}
if (Request.Files["FileLogo"] != null && Request.Files["FileLogo"].ContentLength > 0)
{
byte[] image = new Byte[Request.Files["FileLogo"].ContentLength];
Request.Files["FileLogo"].InputStream.Read(image, 0, Request.Files["FileLogo"].ContentLength);
text.AddLogo(image);
}
TempData["Message"] = text.Name + " сохранен.";
return RedirectToAction("Index");
}
else
return View(text);
}
public ActionResult Delete(int id)
{
var article = textRepository.FindBy(x => x.Id == id).FirstOrDefault();
if (article != null)
{
article.DeleteFiles();
textRepository.Delete(article);
textRepository.Save();
}
TempData["Message"] = "Публикация удалена.";
return RedirectToAction("Index");
}
}
К классам-контроллерам и их методам могут быть применены атрибуты. Наиболее часто применяемыми являются атрибуты для управления доступом авторизованных и неавторизованных пользователей (Authorize, AllowAnonymous). К методам контроллеров часто применяются атрибуты HttpGet и HttpPost, с помощью которых специфицируется тип запроса, который обрабатывается методом. Обычно методы классов возвращают представления – специальные файлы, в которых HTML-код комбинируется с программным кодом на языке программирования Razor (C#-подобный язык программирования):
model DomainModel.Model.Article
@{
ViewBag.Title = "Редактирование публикации";
Layout = "~/Areas/Admin/Views/Shared/_AdminLayout.cshtml";
}
<h2>Редактирование статьи</h2>
<div>@Html.ValidationSummary()</div>
@using (Html.BeginForm("Edit", "ArticleAdmin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<fieldset>
<legend>Редактирование публикации</legend>
<ol>
<li>
@Html.Label("Главное изображение")
<input name="FileLogo" type="file" />
<img style="max-height:100px;" src="@Model.GetLogoUrl()" />
</li>
<li>
@Html.TextBoxFor(model => model.Posted)
<li>
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Posted)
@Html.Label("Заголовок")
@Html.TextBoxFor(model => model.Name)
</li>
<li>
@Html.LabelFor(x => x.MenuName)
@Html.TextBoxFor(model => model.MenuName)
</li>
<li>
</ol>
</fieldset>
<fieldset class="submit">
<input type="submit" value="Сохранить" />
</fieldset>
}
<div>
@Html.ActionLink("Назад к списку", "Index")
</div>
В представлении в блоке @{ ........} может быть написан произвольный код на языке программирования C#. Специальная строка @model служит для указания типа данных, объект которого доступен через переменную Model.
@model IEnumerable<DomainModel.Model.Article>
@{
ViewBag.Title = "Публикации";
Layout = "~/Areas/Admin/Views/Shared/_AdminLayout.cshtml";
}
<h2>
Статьи</h2>
<table class="grid">
<tr>
<th>
</th>
<th>
Id
</th>
<th>
Название
</th>
<th>
На главной
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.ActionLink("Ред. ", "Edit", new { id = item.Id }) |
@Html.ActionLink("Удал. ", "Delete", new { id = item.Id }, new { @class = "Delete" })
</td>
<td>
@Html.Encode(item.Id)
</td>
<td>
@Html.Encode(item.Name)
</td>
<td>
@Html.CheckBox("_", item.IsTarget, new {disabled="true"})
</td>
</tr>
}
</table>
<p>
@Html.ActionLink("Добавить", "Create")
</p>