MVC для начинающих

В докладе будет раскозано о базовых возможностях MVC. Для показа использовалась Visual Studio 2013 Ultimate. Исходники примеров можно скачать ниже

Создание проекта

  • В меню выбираем пункт FILE->NEW->Project
  • В окне "New Project" выбираем пункт Templates->Visual C#->Web->ASP.NET Web Application

  • нажимаем OK
  • Далее выбираем шаблон

Одно из преимуществ MVC приложения над Web Forms это возможность тестирования. Чтобы после создания проекта у Вас автоматически был добавлен проект для Unit тестирования, требуется установить галочку на против Add unit tests

После создания проекта Visual Studio у Вас будет создано простейшее приложение на MVC. 

В отличее от Web Forms, перед запуском MVC приложение вначале следует "отбилдеть" (запустить Build) 

Ознакомление с проектом

Основные папки MVC приложения:

App_Start - папка с конфигурационными настройками. Папка содержит следующие основные параметры:

- BundleConfig.cs - для регистрации css и js файлов. Помогает собирать их в "пучки", а также производить минификацию.

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));
@ViewBag.Title - My ASP.NET Application
@Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") ............ @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false)

FilterConfig.cs - глобалная регистрация фильтров. По умолчанию установлен фильтр для обработки ошибок

RoutingConfig.cs - используется для регистрации схем маршрутов

        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 }
            );
        }

По умолчанию указано, что требуется открывать представление Index из контроллера HomeController.

Content - папка для хранения css файлов и изображений

App_Data - для хранения данных, например xml, mdf и т.д.

Controllers - папка для хранения контроллеров. В данной папке все файлы именуются с добавленем суффикса Controller

namespace MVC4Project.Controllers
{
    public class HomeController : Controller
    {

Models - папка для хранения моделей используемых в проекте

Scripts - папка для хранения js файлов. Файл _reference.js требуется для правильной работы IntelliSense для Javascript

/// 
/// <reference path="modernizr-2.6.2.js">
/// <reference path="jquery-1.10.2.js">
/// <reference path="bootstrap.js">
/// <reference path="respond.js">

Views - папка для хранения представлений

Создание страницы

Создаем контроллер. На папке Controllers нажимаем правой кнопкой мыши, выбираем пункт Add -> Controller

    public class IISController : Controller
    {
        // GET: IIS
        public ActionResult Index()
        {
            return View();
        }
    }

После создания должна автоматически создаться папка IIS в папке Views

Добавляем представление

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Порядок обработки запросов пулом потоков</h2>

<p>На веб-сервере платформа .NET Framework поддерживается пул потоков, которые используются для обслуживания запросов ASP.NET. При получении запроса, для его обработки из этого пула выделяется поток. Если запрос обрабатывается синхронно, поток, который обрабатывает запрос блокируется на время обработки запроса. Такой поток не может обслуживать другой запрос.</p>
<p>Это может не составлять проблемы, так как пул потоков можно сделать достаточно большим для вмещения множества заблокированных потоков. Однако количество потоков в пуле потоков ограничено. В больших приложениях, которые обрабатывают несколько одновременных запросов, которые выполняются длительное время, все доступные потоки могут быть заблокированы. Такая ситуация называется нехваткой потоков. При наступлении такой ситуации веб-сервер помещает запросы в очередь. После заполнения очереди запросов веб-сервер отклоняет запросы, возвращая код ошибки HTTP 503 (сервер перегружен).</p>
</pre>

Для добавления можно вопользоваться следующей возможностью. Нажимаем правой кнопкой мыши на имени метода в контроллере и выбираем пункт Add View

Знакомство с Entity Framework

Данная библиотека предназначена для "объения" C# кода с базой данных.

Для добавления в проект данной библиотеки можно воспользовать Nuget. В проекте на папке References шелкаем правой кнопкой мыши и выбираем пункт Manage Nuget Packages. В нем находим entity Framework

Нам требуется создать страницу с возможностью отправки сообщений на сервер. Для начала создадим модели

Модель сообщения

public class Message
    {
        [Key]
        [System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
        public int MessageId { get;set; }
        
        [DisplayFormat(DataFormatString="{0:dd.MM.yyyy}", ApplyFormatInEditMode=true)]
        [System.ComponentModel.DataAnnotations.DataType(System.ComponentModel.DataAnnotations.DataType.Date)]
        public DateTime Date { get; set; }
        
        [DataType(System.ComponentModel.DataAnnotations.DataType.MultilineText)]
        public string Text { get; set; }

        public virtual MessageType Type { get; set; }
        
        [Display(Name = "Тип сообщения")]
        public int TypeId { get; set; }

        public bool? Disabled { get; set; }
    }

Модель для типа сообщения

    public class MessageType
    {
        [Key]
        [System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
        public int MessageTypeId { get; set; }
        [StringLength(50)]
        public string Name { get; set; }
    }

Здесь внимание нужно обратить на следующий момент. Нам нужно чтобы сообщение могло иметь несколько типов, например вопрос, жалоба. Для создания данной связи в EF можно использовать следующий синтаксис

        public virtual MessageType Type { get; set; }
        
        [Display(Name = "Тип сообщения")]
        public int TypeId { get; set; }

Именование свойство должно соответствовать следующей схеме. Имя типа - [имя виртуального свойство]Id

Создаем класс для подключения к БД

    public class MyDbContext :DbContext
    {
        public DbSet<Message> Messages { get; set; }
        public DbSet<Messagetype> MessageTypes { get; set; }
    }

DbContext - базовый класс для создания подключений

Далее нам требуется создать таблицы в БД. Для этого воспользуемся "Migrations"

Открываем приложение Tools -> Nuget Package Manager -> Package Manager Console

Вводим следующую команду:

Enable-Migrations -ContextTypeName MVC4Project.Models.MyDbContext

Это команда создаст у Вас в проект папку Migrations в ней появиться следующий класс в который требуется внести следующие изменения

    internal sealed class Configuration : DbMigrationsConfiguration
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(MVC4Project.Models.MyDbContext context)
        {
// здесь дописали
            context.MessageTypes.AddOrUpdate(new Models.MessageType() { Name = "Вопрос" },
                new Models.MessageType() { Name = "Жалоба" });
        }
    }

Здесь мы добавили данные для сущности MessageType по умолчанию.

Выполняем следующую команду:

add-migration createFirstTables

createFirstTables - имя для миграции. Оно может быть произвольным

В папке Migrations у вас создатся еще один файл, в котором будет описано каие манипуляции будут произведены с БД

И последняя команда:

update-database

Данная команда создаст БД в папке App_Data в которой буду находиться две таблицы

Scaffolding

Возможность Visual Studio создавать "болванчики" элементов. В нашем случаи мы создадим простой редактор для созданой нами таблицы Message. 

Нажимаем на папке  Controllers правой кнопкой и выбираем пункт Add->New Scaffolded Item   

Нет комментариев

Вам необходим вход для комментария.