Пм03 «участие в интеграции программных модулей» 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Пм03 «участие в интеграции программных модулей»



ПМ03 «УЧАСТИЕ В ИНТЕГРАЦИИ ПРОГРАММНЫХ МОДУЛЕЙ»

для специальности 09.02.03 «Программирование в компьютерных системах»

 

 

 

 

Санкт Петербург

Создание нового веб-приложения ASP.NET

В новом решении или в том же решении, что и проект базы данных, создайте новый проект в Visual Studio и выберите шаблон веб-приложения ASP.NET. Назовите проект ContosoSite.

Нажмите «ОК».

В окне «Новый проект ASP.NET» выберите шаблон MVC. Очистить флажок Узел в облаке. Нажмите «ОК», чтобы создать приложение.

Проект создается с файлами и папками по умолчанию.

Создание базы данных

В обозревателе решений правой кнопкой мыши нажать на папку App_Data и создать новый элемент

Создать базу данных со своим именем

В обозревателе серверов в своей базе данных создать таблицы

Добавьте столбцы в таблицы и определите тип хранимых данных.

Определите первичные и вторичные ключи.

В появившейся надписи подправить названия полей и таблиц

CONSTRAINT [FK_Enrollment_ToTable] FOREIGN KEY ([CourseID]) REFERENCES [Course]([CourseID])

Для полей первичных ключей определите автоинкремент

После того как все таблицы были созданы и все связи были определены переходим к созданию модели данных в приложении.

 

Создание моделей

Теперь вы создадите модели Entity Framework из таблиц базы данных. Эти модели являются классами, которые вы будете использовать для работы с данными. Каждая модель отражает таблицу в базе данных и содержит свойства, соответствующие столбцам в таблице.

Щелкните правой кнопкой мыши папку «Модели» и выберите «Добавить» и «Создать элемент».

В окне «Добавить новый элемент» выберите «Данные» в левой панели и «Модель ADO.NET EDM» из параметров в центральной панели. Назовите новый файл модели ContosoModel.

Нажмите «Добавить».

В Мастере моделей данных сущностей выберите конструктор EF из базы данных.

Нажмите «Далее».

Если у вас есть подключения к базе данных, определенные в вашей среде разработки, вы можете увидеть одно из этих подключений, предварительно выбранных. Однако вы хотите создать новое соединение с базой данных, созданной ранее. Нажмите кнопку «Новое соединение».

Вы можете использовать имя по умолчанию для подключения в файле Web.Config

Нажмите «Далее».

Выберите «Таблицы» для создания моделей для всех трех таблиц.

Нажмите «Готово».

Если вы получили предупреждение о безопасности, выберите «ОК», чтобы продолжить запуск шаблона.

Модели создаются из таблиц базы данных, и отображается диаграмма, показывающая свойства и отношения между таблицами.

Папка «Модели» теперь включает в себя множество новых файлов, связанных с моделями, которые были созданы из базы данных.

ContosoModel.Context.cs файл содержит класс, производный от DbContext класса, а также предоставляет свойство для каждого класса модели, которая соответствует таблице базы данных. В Course.cs, Enrollment.cs и Student.cs файлы содержат классы модели, которые представляют таблицы баз данных. При работе с подклассами вы будете использовать как класс контекста, так и классы модели.

Сейчас необходимо сгенерировать код, который будет обеспечивать стандартные операции с данными для классов модели. Вы добавляете код, добавляя элемент Scaffold. Scaffold будет включать контроллер и представления, соответствующие моделям учащихся и регистрации, которые вы создали в предыдущем разделе. (Необходимо собрать проект, прежде чем добавлять контроллеры!)

Чтобы поддерживать согласованность в вашем проекте, надо добавить новый контроллер в существующую папку Controllers. Щелкните правой кнопкой мыши Контроллеры папку и выберите Добавить – Новый Шаблонный элемент.

Выберите MVC 5 Controller с представлениями, используя параметр Entity Framework. Эта опция генерирует контроллер и представления для обновления, удаления, создания и отображения данных в вашей модели.

Выберите «Студент» для класса модели и выберите ContosoUniversityEntities для класса контекста. Сохраните имя контроллера как StudentsController,

Нажмите «Добавить».

Если вы получили сообщение об ошибке, возможно, это связано с тем, что проект не был создан в предыдущем разделе. Если да, попробуйте создать проект, а затем снова добавьте элемент шаблона.

По завершении процесса генерации кода вы увидите новый контроллер и представления в своем проекте.

Повторите те же шаги, но добавьте Scaffold для класса регистрации. Когда закончите, у вас должен быть файл EnrollmentsController.cs и папка под заголовками Views named Enrollments с помощью представлений «Создать, удалить, детализировать, редактировать и индексировать».

Добавить столбец

Если вы обновляете структуру таблицы в своей базе данных, вам необходимо убедиться, что ваше изменение распространяется на модели данных, представления и контроллер.

В таблицу Student добавьте столбец с именем MiddleName, который имеет тип NVARCHAR (50), и допускает значения NULL.

Разверните это изменение в своей локальной базе данных. Новое поле добавляется в таблицу. Если вы не видите его в обозревателе объектов SQL Server, нажмите кнопку «Обновить» на панели.

Новый столбец существует в таблице базы данных, но в настоящее время он не существует в классе модели данных. Вы должны обновить модель, чтобы добавить новый столбец. В папке «Модели» откройте файл ContosoModel.edmx, чтобы отобразить диаграмму модели. Обратите внимание, что модель Student не содержит свойства MiddleName. Щелкните правой кнопкой мыши в любом месте проектной поверхности и выберите «Обновить модель из базы данных».

В мастере обновления выберите вкладку «Обновить» и таблицу «Студент».

Нажмите «Готово».

По завершении процесса обновления диаграмма базы данных включает новое свойство MiddleName. Сохраните файл ContosoModel.edmx. Вы должны сохранить этот файл для нового свойства, которое будет распространено в классе Student.cs. Теперь вы обновили базу данных и модель.

Постройте решение.

К сожалению, в представлениях все еще нет нового свойства. Чтобы обновить представления, у вас есть два варианта: вы можете повторно сгенерировать представления, добавив снова шаблоны для класса Student, или вы можете вручную добавить новое свойство к существующим представлениям. В этом уроке вы снова добавите шаблоны, потому что вы не внесли никаких изменений в автоматически создаваемые представления. Вы можете вручную добавить свойство, когда вы внесли изменения в представления, и не хотите терять эти изменения.

Чтобы обеспечить повторное создание представлений, удалите папку «Студенты» в разделе «View» и удалите «StudentsController». Затем щелкните правой кнопкой мыши папку Controllers и добавьте шаблон для модели Student. Опять же, назовите контроллер StudentsController. Выберите ОК.

Представления теперь содержат свойство MiddleName.

Вы можете настроить код в соответствии с конкретными требованиями вашего приложения. В настоящее время ваше приложение не отображает зарегистрированные курсы для выбранного студента. В этом разделе вы добавите зарегистрированные курсы для каждого учащегося в представление Details для учащегося.

Open Students / Details.cshtml и ниже последней вкладки </ dl>, но перед закрывающим тегом </ div> добавьте следующий код.

CSHTMLкопия

<table class="table">

<tr>

<th>

Course Title

</th>

<th>

Grade

</th>

<th>

Credits

</th>

</tr>

 

@foreach (var item in Model.Enrollments)

{

<tr>

<td>

@Html.DisplayFor(modelItem => item.Course.Title)

</td>

<td>

@Html.DisplayFor(modelItem => item.Grade)

</td>

<td>

@Html.DisplayFor(modelItem => item.Course.Credits)

</td>

</tr>

}

</table>

Этот код создает таблицу, которая отображает строку для каждой записи в таблице регистрации для выбранного ученика. Метод Display отображает HTML для объекта (modelItem), который представляет выражение. Вы используете метод Display (а не просто вставляете значение свойства в код), чтобы убедиться, что значение отформатировано правильно в зависимости от его типа и шаблона для этого типа. В этом примере каждое выражение возвращает одно свойство из текущей записи в цикле, а значения - это примитивные типы, которые отображаются как текст.

Перейдите к разделу «Студенты / Индекс» и выберите «Подробности» для одного из учеников. Вы увидите, что зарегистрированные курсы включены в представление.

чтобы ограничить длину значений, предоставленных для свойств FirstName, LastName и MiddleName. В базе данных эти значения ограничены 50 символами; однако в вашем веб-приложении ограничение персонажа в настоящее время не применяется. Если пользователь предоставляет более 50 символов для одного из этих значений, страница будет сбой при попытке сохранить значение в базе данных. Вы также ограничите класс до значений от 0 до 4.

Откройте файл Student.cs в папке «Модели». Добавьте в класс следующий выделенный код.

C #копия

namespace ContosoSite.Models

{

using System;

using System.Collections.Generic;

using System.ComponentModel.DataAnnotations;

 

public partial class Student

{

public Student()

{

this.Enrollments = new HashSet<Enrollment>();

}

 

public int StudentID { get; set; }

[StringLength(50)]

public string LastName { get; set; }

[StringLength(50)]

public string FirstName { get; set; }

public Nullable<System.DateTime> EnrollmentDate { get; set; }

[StringLength(50)]

public string MiddleName { get; set; }

 

public virtual ICollection<Enrollment> Enrollments { get; set; }

}

}

В Enrollment.cs добавьте следующий выделенный код.

C #копия

namespace ContosoSite.Models

{

using System;

using System.Collections.Generic;

using System.ComponentModel.DataAnnotations;

 

public partial class Enrollment

{

public int EnrollmentID { get; set; }

[Range(0, 4)]

public Nullable<decimal> Grade { get; set; }

public int CourseID { get; set; }

public int StudentID { get; set; }

 

public virtual Course Course { get; set; }

public virtual Student Student { get; set; }

}

}

Постройте решение.

Перейдите на страницу для редактирования или создания ученика. Если вы попытаетесь ввести более 50 символов, появится сообщение об ошибке.

Перейдите на страницу для редактирования заявок и попытайтесь присвоить оценку выше 4.

Полный список аннотаций проверки данных, которые вы можете применить к свойствам и классам, см. В разделе System.ComponentModel.DataAnnotations.

Добавить ссылки на таблицы

Чтобы облегчить вам переход к новым представлениям, вы можете добавить пару гиперссылок в представления Index для учащихся и учащихся. Откройте файл в Views / Home / Index.cshtml, который является домашней страницей вашего сайта. Добавьте следующий код ниже jumbotron.

CSHTMLкопия

<div>

@Html.ActionLink("List of students", "Index", "Students")<br />

@Html.ActionLink("List of enrollments", "Index", "Enrollments")

</div>

Для метода ActionLink первым параметром является текст, отображаемый в ссылке. Второй параметр - это действие, а третий параметр - имя контроллера. Например, первая ссылка указывает на действие индекса в StudentsController. Из этих значений строится фактическая гиперссылка. Первая ссылка в конечном итоге включает пользователей в файл Index.cshtml в папке Views / Students.

 

Просмотр таблиц с данными

Вы убедитесь, что код, добавленный в ваш проект, правильно отображает список учеников и позволяет пользователям редактировать, создавать или удалять записи учащихся в базе данных.

Щелкните правой кнопкой мыши файл Views / Home / Index.cshtml и выберите «Просмотр в браузере». На этой странице щелкните ссылку для списка учеников.

На этой странице обратите внимание на список учащихся и ссылки для изменения этих данных.

Нажмите ссылку «Создать новую» и укажите некоторые значения для нового ученика.

Нажмите «Создать» и обратите внимание, что новый ученик добавлен в ваш список.

Выберите ссылку «Изменить» и измените некоторые значения для учащегося.

Нажмите «Сохранить» и обратите внимание, что запись студента была изменена.

Наконец, выберите ссылку «Удалить» и подтвердите, что вы хотите удалить запись, нажав кнопку «Удалить».

Без написания кода вы добавили представления, которые выполняют общие операции с данными в таблице Student.

Возможно, вы заметили, что текстовая метка для поля основана на свойстве базы данных (например, LastName), которое не обязательно означает, что вы хотите отображать на веб-странице. Например, вы можете предпочесть, чтобы метка была Фамилия. Вы устраните эту проблему с отображением позже в учебнике.

 

Примечание

Во многих случаях можно вызвать тот же метод, либо набор сущностей Entity Framework, либо как метода расширения для коллекции в памяти. Обычно получаются такие же результаты, но в некоторых случаях результат может отличаться.

Например, реализация.NET Framework Contains метод возвращает все строки, передает пустую строку, когда поставщик Entity Framework для SQL Server Compact 4.0 не возвращает пустые строки. Поэтому код в примере (размещение Where инструкции внутри if инструкции) гарантирует, что вы получите те же результаты для всех версий SQL Server. Кроме того, реализация.NET Framework Contains метод по умолчанию выполняет сравнение с учетом регистра, но поставщики Entity Framework SQL Server по умолчанию выполняют сравнения без учета регистра. Таким образом, вызовом ToUpper производится проверка явно регистронезависимым способом и гарантирует, что результаты не изменятся при изменении кода позднее, которое будет возвращать IEnumerable, а не IQueryable объекта. (При вызове метода Contains коллекции IEnumerable выполняется реализация.NET Framework; при вызове этого же метода у объекта IQueryable выполняется реализация поставщика базы данных.)

Обработка NULL также может быть разным для разных поставщиков баз данных или при использовании IQueryable сравниваемый объект при использовании IEnumerable коллекции. Например, в некоторых сценариях Where условия, такие как table.Column!= 0 не может возвращать столбцы, имеющие null как значение.

 

Изменение контроллера Home

1. В HomeController.cs, добавьте следующий using инструкций в верхней части файла:

using ContosoUniversity.DAL;using ContosoUniversity.ViewModels;

2. Добавьте переменную класса для контекста базы данных сразу после открывающей фигурной скобки для класса:

public class HomeController: Controller{ private SchoolContext db = new SchoolContext();

3. Замените метод About следующим кодом:

public ActionResult About(){ IQueryable<EnrollmentDateGroup> data = from student in db.Students group student by student.EnrollmentDate into dateGroup select new EnrollmentDateGroup() { EnrollmentDate = dateGroup.Key, StudentCount = dateGroup.Count() }; return View(data.ToList());}

Запрос LINQ группирует записи из таблицы студентов по дате зачисления, вычисляет число записей в каждой группе и сохраняет результаты в коллекцию объектов моделей представления EnrollmentDateGroup.

4. Добавление Dispose метод:

protected override void Dispose(bool disposing){ db.Dispose(); base.Dispose(disposing);}

Работа с изображениями

1. с помощью запросов sql На update обновить поле таблицы с image

update Buses

set bus_picture = (SELECT MyImage.* from Openrowset(Bulk 'D:\3.png', Single_Blob) MyImage) where id_bus = 3

 

 

2. в представления таблиц (INDEX.CSHTML, Details.cshtml), имеющей image, добавить элемент управления:

<td>

 

@{ byte[] photo = item.bus_picture;

string imageSrc = null;

if (photo!= null)

{

MemoryStream ms = new MemoryStream();

ms.Write(photo, 0, photo.Length);

string imageBase64 = Convert.ToBase64String(ms.ToArray());

imageSrc = string.Format("data:image/jpg;base64,{0}", imageBase64);

string base64String = Convert.ToBase64String(photo, 0, photo.Length);

}

}

 

<img src="@imageSrc" alt="Image" width="150" height="100" />

</td>

 

3. В Create.cshtml

Добавить

@model WebExASP_Full.Buses

 

@{

ViewBag.Title = "Create";

}

 

<h2>Новый атвобус</h2>

 

 

@using (Html.BeginForm(Html.BeginForm("Create", "Buses", null, FormMethod.Post, new {enctype = "multipart/form-data"})))

 

И элементы управления:

<div class="form-group">

@Html.LabelFor(model=>model.bus_picture, new { @class = "control-label col-md-2" })

<div class="col-md-10">

<input type="file" name="upload" value="Обзор..." />

</div>

</div>

 

<div class="form-group">

<div class="col-md-offset-2 col-md-10">

<input type="submit" value="Добавить" class="btn btn-default" />

</div>

</div>

 

В контроллере этого представления изменить метод public ActionResult Create([Bind(….

public ActionResult Create([Bind(Include="id_bus,name_bus,id_model,date_bus,quant,bus_picture,bus_price")] Buses buses, HttpPostedFileBase upload)

{

if (ModelState.IsValid)

{

if (upload!= null && upload.ContentLength > 0)

{

using (var reader = new System.IO.BinaryReader(upload.InputStream))

{

buses.bus_picture = reader.ReadBytes(upload.ContentLength);

}

}

db.Buses.Add(buses);

db.SaveChanges();

return RedirectToAction("Index");

}

 

ViewBag.id_model = new SelectList(db.ModelsofBuses, "id_model", "name_model", buses.id_model);

return View(buses);

}

 

 

4. в Edit.cshtml

@model WebExASP_Full.Buses

 

@{

ViewBag.Title = "Edit";

}

 

<h2>Edit</h2>

 

 

@using (Html.BeginForm(Html.BeginForm("Edit", "Buses", null, FormMethod.Post, new { enctype = "multipart/form-data" })))

 

Элемент управления:

<div class="editor-label">Фото</div>

<div class="editor-field">

@if (Model.bus_picture == null)

{

@:None

}

else

{

byte[] photo = Model.bus_picture;

string imageSrc = null;

if (photo!= null)

{

MemoryStream ms = new MemoryStream();

ms.Write(photo, 0, photo.Length);

string imageBase64 = Convert.ToBase64String(ms.ToArray());

imageSrc = string.Format("data:image/jpg;base64,{0}", imageBase64);

string base64String = Convert.ToBase64String(photo, 0, photo.Length);

}

 

<img width="250" height="150" src="@imageSrc" />

}

<div>Выбрать новую фотографию: <input type="file" name="upload" /></div>

</div>

 

В контроллере этого представления изменить метод public ActionResult Edit([Bind(Include =…

 

try

{

if (ModelState.IsValid)

{

db.Entry(buses).State = EntityState.Modified;

if (upload!= null && upload.ContentLength > 0)

{

using (var reader = new System.IO.BinaryReader(upload.InputStream))

{

buses.bus_picture = reader.ReadBytes(upload.ContentLength);

}

db.SaveChanges();

}

 

else

{

db.Entry(buses).Property(m => m.bus_picture).IsModified = false;

db.SaveChanges();

}

 

return RedirectToAction("Index");

}

 

return View(buses);

}

catch(Exception e) {}

Регистрация

 

 

 

1. создаем ХП к базе на Insert

 

CREATE PROCEDURE [dbo].[Insert_User]

@Email NVARCHAR(30),

@Password NVARCHAR(20),

@Nickname NVARCHAR(20)

AS

BEGIN

SET NOCOUNT ON;

IF EXISTS(SELECT email FROM UsersASP WHERE email = @Email)

BEGIN

SELECT -1 AS UserId -- Username exists.

END

 

ELSE

BEGIN

INSERT INTO [UsersASP]

([email]

,[password]

,[name_surname]

,[date_reg])

VALUES

(@Email

,@Password

,@Nickname

,GETDATE())

select 1

--SELECT SCOPE_IDENTITY() AS UserId -- UserId

END

END

2. проверяем выполнение ХП на сервере с помощью EXECUTE!!!!

 

3. Добавляем ХП в модель, она отобразится как функция (а не свойство), ее можно увидеть только в ModelBrowser

 

4. Редактируем класс RegisterViewModel в AccountViewModels.cs в зависимости от нужных полей

 

5. редактируем страницу регистрации Register.cshtml в зависимости от нужных полей

 

6. В AccountController.cs редактируем асинхронную функцию Register например так

try

{

// Verification.

if (ModelState.IsValid)

{

// Initialization.

var regInfo = this.DBTest.Insert_User(model.UserName, model.Password,model.NameSurname).ToList();

// Verification.

if (regInfo!= null && Convert.ToInt32(regInfo[0])!=-1)

{

//SAVING CHANGES TO DATABASE

DBTest.SaveChanges();

// return RedirectToAction("Index", "Home");

return RedirectToAction("Login", "Account");

 

}

else

{

ModelState.AddModelError(string.Empty, "ПОЛЬЗОВАТЕЛЬ С ТАКИМ ИМЕНЕМ (E-MAIL) УЖЕ СУЩЕСТВУЕТ.");

}

}

}

catch (Exception ex)

{ }

 

return this.View(model);

 

Авторизация

 

1. ХП на проверку логина\пароля из базы (имя ХП можете дать ЛЮБОЕ)

 

CREATE PROCEDURE [dbo].[LoginByUsernamePassword]

@username varchar(50),

@password varchar(50)

AS

BEGIN

SELECT email, UsersASP.password

FROM UsersASP

WHERE email = @username

AND UsersASP.password = @password

END

 

2. Обновили EDM!

 

3. В "RouteConfig.cs" в папке "App_Start" поменять

routes.MapRoute(

name: "Default",

url: "{controller}/{action}/{id}",

defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional });

по дефолту будет ВХОД В АКК

 

4. В "Startup.Auth.cs"

app.UseCookieAuthentication(new CookieAuthenticationOptions

{

AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,

LoginPath = new PathString("/Account/Login"),

LogoutPath = new PathString("/Account/LogOff"),

ExpireTimeSpan = TimeSpan.FromMinutes(5.0)

});

 

5. В "Global.asax.cs" добавить в конец метода "Application_Start":

AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;

 

6. В "_Layout.cshtml" все страницы-представления убрать под IF

@if (User.Identity.IsAuthenticated)

{

<li>@Html.ActionLink("Home", "Index", "Home")</li>

<li>@Html.ActionLink("About", "About", "Home")</li>

<li>@Html.ActionLink("Contact", "Contact", "Home")</li>

<li>@Html.ActionLink("Buses", "Index", "Buses")</li>}

}

7. В "Index.cshtml" под "Views->Home" для класса jumbotron

<div class="jumbotron">

<h1>Приветики</h1>

<p class="lead">Login from "@User.Identity.Name" Account.</p>

</div>

 

8. В "HomeController.cs" в папке " Controller " оставить только:

[Authorize]

public class HomeController: Controller

{

public ActionResult Index()

{

return View();

}

}

 

Объявить Entity

testEntities1 DBTest = new testEntities1();

 

ПМ03 «УЧАСТИЕ В ИНТЕГРАЦИИ ПРОГРАММНЫХ МОДУЛЕЙ»

для специальности 09.02.03 «Программирование в компьютерных системах»

 

 

 

 

Санкт Петербург



Поделиться:


Последнее изменение этой страницы: 2019-04-27; просмотров: 297; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.192.75.131 (0.314 с.)