Chat Item Chat public class Chat Item public
Модель: классы Chat. Item и Chat public class Chat. Item { public string Message { set; get; } public string Author { set; get; } public Date. Time { set; get; } } public static class Chat { public static List<Chat. Item> list = new List<Chat. Item>(); static object _obj. Lock = new Object(); public static void Add. Item(Chat. Item item) { if (string. Is. Null. Or. White. Space(item. Author)) item. Author = "Anonimus"; item. Time = Date. Time. Now; lock (_obj. Lock) { list. Add(item); } } } 6
Шаблон представления @model Chat. MVC. Models. VModel @{ Layout = "~/Views/Shared/_Layout. cshtml"; } <h 2>Chat MVC</h 2> <div id="chat"> @foreach (var item in Model. All) { <section class='message'> <span class='author'>@item. Author: </span> @item. Message <span class='time'>@item. Time</span> </section> } </div> <form method="post" action="/Home/Index"> @Html. Validation. Summary() Сообщение: <br/> <textarea id="message" name="message" ></textarea> <br/> Подпись: <input type="text" id="author" name="author" value="@Model. Author"/> <input type="submit" value="Submit"/> <br/> </form> Директива @model позволяет получать подсказки во время разработки. Во время выполнения она роли не играет. 10
Проверка в модели, интерфейс IValidatable. Object public class VModel: IValidatable. Object { public List<Chat. Item> All { set; get; } public string Message { set; get; } public string Author { set; get; } public IEnumerable<Validation. Result> Validate( Validation. Context validation. Context) { if (string. Is. Null. Or. White. Space(Message)) yield return new Validation. Result("Message must not be empty. "); } } При помощи интерфейса IValidatable. Object MVC фреймворк собирает сведения об ошибках в коллекцию Model. State. Объект Model. State потом будет доступен в контроллере и в представлении. 12
Действия в контроллере и в представлении В контроллере: [Http. Post] public Action. Result Index(VModel vm) { if (Model. State. Is. Valid) { Chat. Item item = new Chat. Item() { Message = vm. Message, Author = vm. Author }; Chat. Add. Item(item); vm. Message = ""; vm. Author = ""; } vm. All = Chat. list; return View(vm); } В представлении: <form method="post" action="/Home/Index"> @Html. Validation. Summary() Сообщение: <br/> <textarea id="message" name="message" ></textarea> <br/> Подпись: <input type="text" id="author" name="author" value="@Model. Author"/> <input type="submit" value="Submit"/> <br/> </form> 13
Bundling & Minification public class Bundle. Config { public static void Register. Bundles(Bundle. Collection bundles) { bundles. Add(new Style. Bundle("~/css"). Include("~/Content/site. css")); bundles. Add(new Script. Bundle("~/js"). Include("~/Scripts/site. js")); } } @Styles. Render("~/css") @Scripts. Render("~/js") + = <script src="/Scripts/site. js"></script> <link href="/Content/site. css" rel="stylesheet"/> Метод Register. Bundles() вызывается на старте приложения. Строка "~/css" – имя упаковки. Имя должно иметь вид виртуального пути в приложении. В web. config должна быть указана версия целевого фреймвормка, у нас это 4. 5. <compilation debug="false" target. Framework="4. 5" /> 14
- Slides: 24