Інженерія програмних систем

Download Report

Transcript Інженерія програмних систем

Controller
View
Model
ASP.NET MVC
2010
Зміст
•
•
•
•
Web-фреймворки на основі архітектури MVC
Підтримка ASP.NET MVC-проектування у MS Visual Studio.
Маршрутизація в ASP.NET MVC-проектах
Приклад розробки проекту із використанням стратегії “від моделі” .
Entity Framework як ORM-framework. Моделі, таблиці, класи в Entity
Framework
• Контролери в ASP.NET MVC-проектах.
• Майстри генерації View для операцій перегляду, редагування,
створення та вилучення даних
• Засади валідації в ASP.NET MVC-проектах. Використання partial-класів
та метаданих Ненав’язлива (Unobtrusive) Java-script валідація
ASP.NET MVC - 2010
2
Web-фреймворки на основі архітектури MVC
httpзапит
Диспетчер
Mapping
Controller
View («webсторінка»)
Engine
htmlсторінка
Model
Mapping: URL-адреса --> Controller
Іноді View може бути просто
html-сторінкою
ASP.NET MVC - 2010
3
Web-фреймворки на основі архітектури MVC
Controller
Model – об’єкти, починаючи від бізнес-логіки
і до логіки підтримки роботи з БД;
View
View – інтерфейс (орієнтований на
використання людиною);
Controller – логіка взаємодії (між View та Model) у
процесі отримання за запитом відповіді та підготовки до її відображення
Model
httpзапит
Диспетчер
Controller
View («webсторінка»)
Engine
htmlсторінка
Використовує
Іноді View може бути просто
html-сторінкою
Mapping
Model
Mapping: URL-адреса --> Controller
ASP.NET MVC - 2010
4
ASP NET MVC Framework
httpзапит
Диспетчер
Використання архітектури MVC надає
технології ASP NET MVC такі важливі
риси як ефективність та акуратність
Controller
View («webсторінка»)
Engine
Controller
Mapping
htmlсторінка
View
Model
ASP NET MVC:
Model
• Диспетчер – має назву “маршрутизатор”;
– Mapping – сукупність “маршрутів”. Окремий “маршрут” деяким
варіантам URL-адрес ставить у відповідність дію (action) – метод
“контроллер-класу”
• View асоціюється з деякими варіантами web-сторінок:
– aspx-сторінки;
Можуть використовуватись й інші варіанти у
відповідності до наявних Engine.
ASP.NET
MVC - 2010
– razor-сторінки (файли
з розширенням
cshtml).
5
ASP.NET MVC-проекти.
Використання майстра у MS Visual Studio
ASP.NET MVC - 2010
6
Налаштування проекту-заготівки (шаблонного
проекту)
ASP.NET MVC - 2010
7
Робота з шаблонним проектом (1/2)
ASP.NET MVC - 2010
8
Робота з шаблонним проектом (2/2)
ASP.NET MVC - 2010
9
Структура шаблонного проекту. Угоди про
каталоги, імена, ще один mapping (action -> view)
Обов’язкові
каталоги
Обов’язковий
суфікс
Визначається
mapping -угодою
Структура каталогів визначається угодою
Визначається
mapping -угодою
Файл HomeController.cs
ASP.NET MVC - 2010
10
Маршрутизація. (Файл Global.asax) (1/2)
Можна:
• додавати нові маршрути;
• забороняти (ігнорувати)
маршрути;
• задавати обмеження.
Файл Global.asax
(фрагмент)
ASP.NET MVC - 2010
11
Маршрутизація. (Файл Global.asax) (2/2)
Файл Global.asax
ASP.NET MVC - 2010
12
Приклад маршрутизації.
(Шаблонний проект. Файл HomeController.cs )
ASP.NET MVC - 2010
13
Маршрутизація у розширеному проекті
”Mvc3_Students” (1/2)
ASP.NET MVC - 2010
14
Маршрутизація у розширеному проекті
”Mvc3_Students” (2/2)
action = “Index”
(за замовуванням)
Файл Global.asax (фрагмент)
ASP.NET MVC - 2010
15
Розширений проект ”Mvc3_Students”.
Використання стратегії розробки “від моделі”
EDM – Entity Data Model
Ім’я моделі
ASP.NET MVC - 2010
16
Створення порожньої моделі та додавання сутності.
(Entity Data Model, EDM)
ASP.NET MVC - 2010
17
Сутність (entity) Student
ASP.NET MVC - 2010
18
Запуск майстра створення бази даних за моделлю
ASP.NET MVC - 2010
19
Діалогові вікна
майстра створення
БД (1/4)
ASP.NET MVC - 2010
20
Діалогові вікна майстра створення БД (2/4)
Установлення
підключення до БД
ASP.NET MVC - 2010
21
Діалогові вікна майстра створення БД (3/4)
DDL-код
ASP.NET MVC - 2010
22
Діалогові вікна майстра створення БД (4/4)
Запуск скрипта
ASP.NET MVC - 2010
23
Виконання SQL-скрипта
(вимагає під’єднання до БД)
Зауваження. SQL ServerCompact Edition – не дуже
вдалий інструментарій для нашої задачі (наявні проблеми з
Identity, що мав би забезпечувати підтримку автоматичної
генерації ключів – див. слайд “Сутність (entity) Student”)
ASP.NET MVC - 2010
24
Entity Framework. Моделі, таблиці, класи
Model - ім’я нашої моделі
ASP.NET MVC - 2010
25
Таблиця Students. Наповнення таблиці
ASP.NET MVC - 2010
26
Файл Model.Designer.cs (фрагменти)
Model – обране ім’я
для нашої моделі
ModelContainer, Student – два
класи, згенеровані Emptity Framework
ASP.NET MVC - 2010
(ORM-фреймворком)
27
Контролери. Вікно майстра генерації контролера
!
ASP.NET MVC - 2010
28
Файл StudController.cs
(згенерований майстром)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Mvc3_Students.Controllers
{
public class StudController : Controller
{
//
// GET: /Stud/
public ActionResult Index()
{
return View();
}
//
// GET: /Stud/Details/5
. . .
public ActionResult Details(int id)
{
return View();
}
//
// GET: /Stud/Create
public ActionResult Create()
{
return View();
ASP.NET MVC - 2010
}
29
Дії (методи Action) контролерів
public ActionResult Details(int id)
{
return View();
}
Від
•
•
•
•
•
•
•
ActionResult успадковуються:
ViewResult;
//для задання View
EmptyResult;
RedirectResult;
//для перенаправлення "на інший URL"
JsonResult;
ContentResult;
//для задання тексту
FileContentResult;
...
ASP.NET MVC - 2010
30
Дії (методи Action) контролерів. Приклад
StudController
// GET: /Stud/Details/5
public ActionResult Details(int id) // Варіант 1
{
var ctx = new Mvc3_Students.Models.ModelContainer();
return View(ctx.Students.SingleOrDefault(st => st.Id == id));
}
// GET: /Stud/Details/5
StudController
public ActionResult Details(int id) // Варіант 2
{
var ctx = new Mvc3_Students.Models.ModelContainer();
ViewData.Model = ctx.Students.SingleOrDefault(st => st.Id == id);
return View();
}
ASP.NET MVC - 2010
31
Файл StudController.cs . Реалізація дії (action) Index.
Генерація (додавання) View
Ім’я моделі
ПКМ в межах Action
ModelContainer – контейнерний клас, згенерований Emptity Framework (ORM-фреймворком)
ASP.NET MVC - 2010
32
Вікно майстра генерація View (для Action Index)
Створення View (Index.cshtml)
!
ASP.NET MVC - 2010
33
Файл Views\Stud\Index.cshtml
(view, згенерований майстром )
@model IEnumerable<Mvc3_Students.Models.Student>
Фрагмент веб@{
ViewBag.Title = "Index";
сторінки у браузері
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th></th>
<th>
Name
</th>
<th>
Course
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id })|
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
<td>
@item.Name
</td>
<td>
@item.Course
</td>
</tr>
}
ASP.NET MVC - 2010
34
</table>
Index.cshtml
Зміни у шаблоні _Layout.cshtml
Змінено
Додано
ASP.NET MVC - 2010
35
Поточний стан розробки проекту
Сторінка Index
ASP.NET MVC - 2010
36
Details (action, view)
Action
Створення View
(Details.cshtml)
!
Сторінка Details
ASP.NET MVC - 2010
37
Файл Details.cshtml – view
(допрацьована україномовна версія сторінки)
ASP.NET MVC - 2010
38
Зауваження до маршрутизації та реалізації
Action-методів (1/2)
Перегляд HTML-коду
сторінки (у браузері)
ASP.NET MVC - 2010
39
Зауваження до маршрутизації та реалізації
Action-методів (2/2)
Перегляд HTML-коду
сторінки (у браузері)
ASP.NET MVC - 2010
40
До реалізації Create
/Stud/Create
View, як інтерфейс, для обох
запитів може бути обраний
один, але ці запитии
потребують різної обробки
(зауважимо, що один з них є
HttGet-запитом, а інший –
запитом HttPost).
ASP.NET MVC - 2010
41
Два Action-методи Create
// GET: /Stud/Create
public ActionResult Create()
{
return View(new Student());
}
// POST: /Stud/Create
[HttpPost]
public ActionResult Create(Student stToAdd)
{
if (!ModelState.IsValid) return View(stToAdd);
var ctx = new ModelContainer();
ctx.AddToStudents(stToAdd);
ctx.SaveChanges();
return RedirectToAction("Index");
}
ASP.NET MVC - 2010
42
Create. Створення View
Створення View
(Create.cshtml)
!
ASP.NET MVC - 2010
Сторінка Create
43
Файл Create.cshtml
@model Mvc3_Students.Models.Student
У проекті використано спрощений
@{
ViewBag.Title = "Create"; }
підхід до маніпулювання ключами Id
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script
src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
<div class="editor-label">
@using (Html.BeginForm()) {
@Html.LabelFor(model => model.Id)
@Html.ValidationSummary(true)
</div>
<fieldset>
<div class="editor-field">
@Html.EditorFor(model => model.Id)
<legend>Student</legend>
@Html.ValidationMessageFor(model => model.Id)
</div>
<div class="editor-label">
Додано для Id
@Html.LabelFor(model => model.Name)
Name</div>
фрагмент
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name) @*. . . Course *@
</div>
Подібний Course<p> <input type="submit" value="Create" /> </p>
фрагмент
</fieldset>
}
<div>
MVC
- 2010
@Html.ActionLink("Back to ASP.NET
List",
"Index")
</div>
44
Два Action-методи Edit
// GET: /Stud/Edit/5
Використовується форма
(View) для редагування
[HttpGet]
public ActionResult Edit(int id)
{
var ctx = new Mvc3_Students.Models.ModelContainer();
return View(ctx.Students.Single(x => x.Id == id));
}
// POST: /Stud/Edit/5
public ActionResult Edit(Student student)
{
if (!ModelState.IsValid) return View(student);
var ctx = new Mvc3_Students.Models.ModelContainer();
var studOld = ctx.Students.Single(s => s.Id == student.Id);
studOld.Course = student.Course;
studOld.Name = student.Name;
ctx.SaveChanges();
return RedirectToAction("Index");
}
ASP.NET MVC - 2010
45
Edit . Створення View
Створення View
(Edit.cshtml)
Сторінка Edit
!
ASP.NET MVC - 2010
46
Delete. Два Action-методи
// GET: /Stud/Delete/5
Використовується форма (View)
public ActionResult Delete(int id)
для перегляду і підтвердження
{
var ctx = new Mvc3_Students.Models.ModelContainer();
return View(ctx.Students.Single(x => x.Id == id));
}
// POST: /Stud/Delete/5
[HttpPost]
public ActionResult Delete(Student student)
{
try
{
var ctx = new Mvc3_Students.Models.ModelContainer();
var stud = ctx.Students.Single(s => s.Id == student.Id);
ctx.DeleteObject(stud);
ctx.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
ASP.NET MVC - 2010
47
Delete. Створення View
Створення View
(Delete.cshtml)
!
ASP.NET MVC - 2010
Сторінка Delete
48
Специфіка проектів з SQL Server Compact Edition
Потрібно додати!
ASP.NET MVC - 2010
49
Валідація. Сторінка Log On (1/3)
Сторінка Log On
шаблонного проекту
ASP.NET MVC - 2010
50
Валідація. Сторінка Log On (2/3)
Вигляд згенерованого
HTML-коду (фрагменти).
(Зверніть увагу на
атрибути data-...
<div class="editor-field">
<input data-val="true" data-val-required="Требуется поле Имя пользователя."
id="UserName" name="UserName" type="text" value="" />
HTML 5
<span class="field-validation-valid" data-valmsg-for="UserName"
data-valmsg-replace="true"></span>
</div>
<script src="/Scripts/jquery-1.4.4.min.js"
type="text/javascript"></script>
<script src="/Scripts/jquery.validate.min.js"
type="text/javascript"></script>
<script
src="/Scripts/jquery.validate.unobtrusive.min.js"
type="text/javascript"></script>
<div class="editor-label">
<label for="Password">Пароль</label>
Ненав’язлива валідація
</div>
(Unobtrusive validation)
<div class="editor-field">
<input data-val="true" data-val-required="Требуется поле Пароль."
id="Password" name="Password" type="password" />
<span class="field-validation-valid" data-valmsg-for="Password"
data-valmsg-replace="true"></span>
ASP.NET MVC - 2010
51
</div>
Валідація. Сторінка Log On (3/3)
ASP.NET MVC - 2010
Файл LogOn.cshtml
(фрагмент)
52
Сторінка Log On. Засади валідації
(1/3)
Файл Web.config
<configuration>
(фрагмент)
. . .
<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
. . .
</configuration>
ASP.NET MVC - 2010
53
Сторінка Log On. Засади валідації.
А чи клієнтська? (2/3)
<legend>Сведения учетной записи
@System.DateTime.Now.ToLongTimeString()
</legend>
Зміни (годинник)! Файл LogOn.cshtml (фрагмент)
Схоже, що валідація є клієнтською. В усякому
разі повністю сторінка не перемальовується.
ASP.NET MVC - 2010
54
Сторінка Log On. Засади валідації.
Використання атрибутів (3/3)
Файл AccountModels.cs
(фрагмент)
public class LogOnModel
{
[Required]
[Display(Name = "Имя пользователя")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Пароль")]
public string Password { get; set; }
[Display(Name = "Запомнить меня")]
public bool RememberMe { get; set; }
}
ASP.NET MVC - 2010
55
Сторінка Log On. Варіант серверної валідації
<appSettings>
<add key="ClientValidationEnabled" value=”false" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
Файл Web.config
(фрагмент)
Час відрізняється!
ASP.NET MVC - 2010
56
Сторінка Log On. Варіант серверної валідації
Вигляд згенерованого
HTML-коду (фрагмент)
<div class="editor-label">
<label for="UserName">Имя пользователя</label>
</div>
<div class="editor-field">
<input id="UserName" name="UserName" type="text" value="" />
</div>
<div class="editor-label">
<label for="Password">Пароль</label>
</div>
ASP.NET MVC - 2010
57
Сторінка Log On.
Не Unobtrusive клієнтська валідація (1/2)
<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="false" />
</appSettings>
Файл Web.config (фрагмент)
ASP.NET MVC - 2010
58
Сторінка Log On.
Не Unobtrusive клієнтська валідація (2/2)
<form action="/Account/LogOn" id="form0" method="post">
<div>
<fieldset>
<legend>Сведения учетной записи 20:33:41</legend>
<div class="editor-label">
<label for="UserName">Имя пользователя</label>
Вигляд згенерованого
</div>
<div class="editor-field">
HTML-коду (фрагмент)
<input id="UserName" name="UserName" type="text" value="" />
<span class="field-validation-valid»
id="UserName_validationMessage"></span>
</div>
. . .
</form><script type="text/javascript">
//<![CDATA[
if (!window.mvcClientValidationMetadata) {
window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({ "Fields": [{
"FieldName": "UserName", "ReplaceValidationMessageContents": true,
"ValidationMessageId": "UserName_validationMessage", "ValidationRules":
[{ "ErrorMessage": "Требуется поле Имя пользователя.",
"ValidationParameters": {}, "ValidationType": "required"}] }, {
"FieldName": "Password", "ReplaceValidationMessageContents": true,
"ValidationMessageId": "Password_validationMessage", "ValidationRules":
[{ "ErrorMessage": "Требуется поле Пароль.", "ValidationParameters": {},
"ValidationType": "required"}]}], "FormId": "form0",
"ReplaceValidationSummary": false });
ASP.NET MVC - 2010
59
//]]>
</script>
Валідація даних про студентів (1/3)
Валідація у цих
випадках є бажаною
ASP.NET MVC - 2010
60
Валідація даних про студентів (2/3)
// POST: /Stud/Create
[HttpPost]
public ActionResult Create(Student stToAdd)
{
if (!ModelState.IsValid)
return View(stToAdd);
. . .
}
Файл StudController.cs
(фрагменти)
// POST: /Stud/Edit/5
[HttpPost]
public ActionResult Edit(Student student)
{
if (!ModelState.IsValid)
return View(student);
. . .
}
ASP.NET MVC - 2010
61
Валідація даних про студентів (3/3)
Як можна побачити, згенерованим кодом
деяка валідація даних уже забезпечується,
проте у нашому випадку бажано задіяти
додаткові вимоги, наприклад, щоб значення
курсу було в межах від 1 до 5. Також варто
задіяти обмеження на довжину імені.
Додати атрибути?
Але ж клас Student згенерував
Entity Framework і ним же цей
клас може бути перегенерований!
ASP.NET MVC - 2010
62
Валідація даних про студентів. Використання
partial-класів та метаданих (1/2)
namespace Mvc3_Students.Models
Фрагменти файлу Model.Designer.cs
{ . . .
#region Сущности
[EdmEntityTypeAttribute(NamespaceName="Model",
Name="Student")]
Entity Framework
[Serializable()]
генерує partial клас !
[DataContractAttribute(IsReference=true)]
public partial class Student : EntityObject
{ . . .
using System.ComponentModel.DataAnnotations;
namespace Mvc3_Students.Models
{
[MetadataType(typeof(StudentDataAnnotations))]
public partial class Student
{
}
public class StudentDataAnnotations
{
[Required]
public int Id { get; set; }
Файл Student.cs
(фрагмент)
[Required]
[StringLength(10)]
public string Name { get; set; }
[Required]
[Range(1, 5)]
MVC - 2010
63
publicASP.NET
int Course
{ get; set; }
}
}
Валідація даних про студентів. Використання
partial-класів та метаданих (2/2)
[MetadataType(typeof(StudentDataAnnotations))]
public partial class Student
{
}
public class StudentDataAnnotations
{
[Required]
public int Id { get; set; }
[Required]
[StringLength(10)]
public string Name { get; set; }
}
[Required]
[Range(1, 5)]
public int Course { get; set; }
ASP.NET MVC - 2010
Фрагмент файлу Student.cs
64
Додаток
ASP.NET MVC - 2010
65
Додаток
ASP.NET MVC - 2010
66
Додаток
ASP.NET MVC - 2010
67
Сутністна модель даних (Entity Data Model, EDM)
Entity Data Model :
• Схема сховища (Store Schema Definition Language, SSDL)
• Концептуальна схема (Conceptual Schema Definition
Language, CSDL)
• Схема відображення (Mapping Schema Language, MSL)
ASP.NET MVC - 2010
68
Model.edmx. Entity Data Model : Схема сховища
(Store Schema Definition Language, SSDL)
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="Model.Store" Alias="Self" Provider=
"System.Data.SqlServerCe.3.5" ProviderManifestToken="3.5" xmlns:store=
"http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
<EntityContainer Name="ModelStoreContainer">
<EntitySet Name="Students" EntityType="Model.Store.Students"
store:Type="Tables" Schema="dbo" />
</EntityContainer>
<EntityType Name="Students">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="int" Nullable="false" />
<Property Name="Name" Type="nvarchar" Nullable="false" />
<Property Name="Course" Type="int" Nullable="false" />
</EntityType>
</Schema></edmx:StorageModels>
ASP.NET MVC - 2010
69
Model.edmx. Entity Data Model : Концептуальна схема
(Conceptual Schema Definition Language, CSDL)
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm"
xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/
EntityStoreSchemaGenerator"
Namespace="Model" Alias="Self" xmlns:annotation=
"http://schemas.microsoft.com/ado/2009/02/edm/annotation">
<EntityContainer Name="ModelContainer"
annotation:LazyLoadingEnabled="true">
<EntitySet Name="Students" EntityType="Model.Student" />
</EntityContainer>
<EntityType Name="Student">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false"
annotation:StoreGeneratedPattern="None" />
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="Int32" Name="Course" Nullable="false" />
</EntityType>
</Schema>
ASP.NET MVC - 2010
70
</edmx:ConceptualModels>
Model.edmx. Entity Data Model : Схема відображення
(Mapping Schema Language, MSL)
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns=
"http://schemas.microsoft.com/ado/2008/09/mapping/cs">
<EntityContainerMapping StorageEntityContainer="ModelStoreContainer"
CdmEntityContainer="ModelContainer">
<EntitySetMapping Name="Students">
<EntityTypeMapping TypeName="IsTypeOf(Model.Student)">
<MappingFragment StoreEntitySet="Students">
<ScalarProperty Name="Id" ColumnName="Id" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="Course" ColumnName="Course" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping></edmx:Mappings>
ASP.NET MVC - 2010
71
From DB
ASP.NET MVC - 2010
72
From DB
ASP.NET MVC - 2010
73
From DB
ASP.NET MVC - 2010
74
From DB
ASP.NET MVC - 2010
75
From DB
ASP.NET MVC - 2010
76
From DB
ASP.NET MVC - 2010
77
From DB
ASP.NET MVC - 2010
78
From DB
ASP.NET MVC - 2010
79
До валідації
У проекті дозволено клієнтську валідацію
ASP.NET MVC - 2010
80
До валідації у MVC 2
•
<% Html.EnableClientValidation();%>
У проекті дозволено клієнтську валідацію
ASP.NET MVC - 2010
81
Перевірка успішності валідації
// GET: /Stud/Edit/5
public ActionResult Edit(int id)
{
var ctx = new Mvc3_Students.Models.ModelContainer();
return View(ctx.Students.Single(x => x.Id == id));
}
// POST: /Stud/Edit/5
На сервері
[HttpPost]
public ActionResult Edit(Student student)
{
if (!ModelState.IsValid) return View(student);
try
{ var ctx = new Mvc3_Students.Models.ModelContainer();
var stud = ctx.Students.Single(s => s.Id == student.Id);
TryUpdateModel(stud);
ctx.SaveChanges();
return RedirectToAction("Index");
}
catch
{ return View();
ASP.NET MVC - 2010
}
}
82