Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
4 / 4 / 1
Регистрация: 20.09.2012
Сообщений: 74
1

Клиентская валидация

08.06.2017, 20:19. Показов 1696. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Пишу приложение "Библиотека". Нужно реализовать серверную и клиентскую валидации данных.

Модель имеет следующий вид:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
namespace BookEditor.Models
{
    public class Book
    {
        // ID книги
        [ScaffoldColumn(false)]
        public int Id { get; set; }
        // название книги
        [Required(ErrorMessage = "Введите название книги")]
        [StringLength(30, ErrorMessage="Длина поля "Название книги" не может превышать 30 символов")]
        public string Title { get; set; }
        // список авторов
        [Required(ErrorMessage = "Укажите хотя бы одного автора")]
        public string AuthorsList { get; set; }
        // автор книги
        public int AuthorId { get; set; }
        // количество страниц
        [Required]
        [Range(1, 10000, ErrorMessage = "Введите количество страниц (более 0 и менее 10000)")]
        public int PageCount { get; set; }
        // наименование издательства
        public string PublishHouse { get; set; }
        // год публикации
        [Range(1800, 2017, ErrorMessage="Год должен быть не ранее 1800")]
        public int PublishYear { get; set; }
        // изображение
        public byte[] Cover { get; set; }
        //Расширение изображения
        public string CoverMimeType { get; set; }
        // автор книги
        public virtual Author Author { get; set; }
        // аннотация
        public string Annotation { get; set; }
    }
}
Контроллер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
namespace BookEditor.Controllers
{
    public class HomeController : Controller
    {
        // создаем контекст данных
        private BookContext db = new BookContext();
 
        public ActionResult Index()
        {
            var books = db.Books
            return View(books);
        }
 
        [HttpGet]
        public ActionResult EditBook(int? book_id)
        {
            if (book_id == null)
            {
                return PartialView("EditBook", new Book());
            }
            var books = db.Books.Where(book => book.Id == book_id).FirstOrDefault();
            return PartialView("EditBook", books);
        }
 
        [HttpPost]
        public ActionResult EditBook(Book book)
        {
            if (ModelState.IsValid)
            {
                int id = book.Id;
                return View();
            }
            return PartialView("EditBook", book);
        }
    }
}
Представление:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
@model BookEditor.Models.Book
 
<div class = "edit-book-close">
    <div class="popup-edit-book__close-button js-close-book-button">Закрыть</div>
</div>
@using (Ajax.BeginForm("EditBook", null, new AjaxOptions { HttpMethod = "Post" }, new { enctype = "multipart/form-data", id = "edit-book-form" }))
{
        <div class="popup-edit-book__book-id">
            @Html.HiddenFor(book => book.Id)
        </div>
        <div class="popup-edit-book__book-title">
            <label class="popup-edit-book__title-label">Книга:</label>
            @Html.TextBox("Title", Model.Title, new { @class = "popup-edit-book__title", title = "Наименование - " + Model.Title, placeholder = "Введите наименование книги" })
            @Html.ValidationMessageFor(book => book.Title)
        </div>
        <div class="popup-edit-book__book-cover" id="book-cover-container">
            <img class="popup-img-cover" id="cover-in-popup" src="@Url.Action("GetImage", "Home", new { book_id = Model.Id })">
            <div class="edit-cover">
                <a class="edit-cover__add edit-link-labels js-edit-cover" title="Выбрать изображение">Выбрать</a>
                <span class="delimiter">|</span>
                <a class="edit-cover__remove edit-link-labels js-remove-cover" title="Удалить изображение">Удалить</a>
            </div>       
            <input class="input-file-choose-cover js-choose-cover" id="input-cover" type="file" name="Cover" value ="" accept="image/*"/>
        </div>
        <div class="popup-edit-book__book-params">
            <div class="popup-edit-book__input popup-author">
                <div class="popup-edit-book__author-label">
                    <label class="author-label">Автор:</label>
                    <a class="popup-edit-book__change-author edit-author__link-label edit-link-labels js-change-authors-button">Изменить</a>
                </div>
                <div class="popup-edit-book__authors-list">
                    @Html.TextArea("AuthorsList", Model.AuthorsList, new { @class = "edit-book__book-author input-book-param", title = "Список авторов", @readonly = true, wrap = "soft | hard" })
                    @Html.ValidationMessageFor(book => book.AuthorsList)
                </div>
                <div class="change-book-authors-popup" id="change-author-panel">
                    <div class="change-book-authors-popup__close">
                        <div class="popup-edit-book__close-button" id="js-close-authors-list-button">Закрыть</div>
                    </div>
                    <div class="change-book-authors">
                        <div class="change-book-authors__author change-book-authors__author-name">
                            <label>Имя</label>
                            <input class="input-author-name" id="author-name" type="text" name="Name">
                            <div class="author-name-errors-panel add-author-errors-panel">
                            </div>
                        </div>
                        <div class="change-book-authors__author change-book-authors__author-surname">
                            <label>Фамилия</label>
                            <input class="input-author-surname" id="author-surname" type="text" name="Surname">
                            <div class="author-name-errors-panel add-author-errors-panel">
                            </div>
                        </div>
                        <div class="change-book-authors__add-author">
                            <input type="button" class="add-author-button" value="Добавить">
                        </div>
                        <div class="change-book-authors__authors-list">
                            <ul class="list-of-authors">
                            </ul>
                        </div>   
                    </div>
                    <div class = "change-book-authors__save-author-button">
                        <input class="save-authors-button" id="js-save-authors-button" type="button" value="Сохранить"/>
                    </div>             
                </div>
            </div>
            <div class="popup-edit-book__input popup-pages">
                <label class="popup-edit-book__page-count-label">Количество страниц:</label>
                @Html.TextBox("PageCount", Model.PageCount, new { @class = "edit-book__page-count input-book-param", title = "Количество страниц", placeholder = "Введите количество страниц"})
                @Html.ValidationMessageFor(book => book.PageCount)
            </div>
            <div class="popup-edit-book__input popup-pubhouse">
                <label class="popup-edit-book__PubHouse-label">Издательство:</label>
                @Html.TextBox("PublishHouse", Model.PublishHouse, new { @class = "edit-book__pubhouse input-book-param", title = "Издательство", placeholder = "Введите наименование издательства"})
                @Html.ValidationMessageFor(book => book.PublishHouse)
            </div>
            <div class="popup-edit-book__input popup-pubyear">
                <label class="popup-edit-book__PubYear-label">Год публикации:</label>
                @Html.TextBox("PublishYear", Model.PublishYear, new { @class = "edit-book__pubyear input-book-param", title = "Год публикации", placeholder = "Введите год публикации"})
                @Html.ValidationMessageFor(book => book.PublishYear)
            </div>
        </div> 
        <div class="popup-edit-book__annotation">
            <label class="popup-edit-book__annotation-label">Аннотация:</label>
            @Html.TextArea("Annotation", Model.Annotation, new { @class = "edit-book__annotation input-book-param", title = "Аннотация", maxlength = 3000, rows = 10 })
        </div>
        <div class = "popup-edit-book__save-button">
            <input type="submit" class = "save-button" value="Сохранить">
        </div>
}
При нажатии на "Сохранить" валидация происходит, но только серверная. Ошибки при этом в представление не выводятся. Подскажите пожалуйста, в чем может быть проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2017, 20:19
Ответы с готовыми решениями:

Валидация не проходит ни клиентская ни серверная
Добрый день, уважаемые форумчане , Подскажите пожалуйста в чем может быть проблема. Есть клас...

Клиентская валидация при изменении DOM
Когда пишу во вьюшке просто &lt;select data-val=&quot;true&quot; data-val-required=&quot;Выберете&quot; значение=&quot;&quot; ...

Разделитель у decimal не принимает ни клиентская, ни серверная часть
И опять эти пляски с разделителем. Разбираюсь по книжке Сандерсона. В таблице ms sql есть поле...

Валидация не проходит
Всем привет! Ребят подскажите как заставить работать это: У меня в базе поля типа decimal...

6
Эксперт .NET
12099 / 8410 / 1288
Регистрация: 21.01.2016
Сообщений: 31,718
09.06.2017, 05:43 2
AlikSoldier, убедитесь, что у вас на странице подключены соответствующие JavaScript библиотеки.
0
4 / 4 / 1
Регистрация: 20.09.2012
Сообщений: 74
09.06.2017, 11:17  [ТС] 3
Usaga, первым делом посмотрел. Подключены
У меня получилось вывести ошибки в представление, но в результате серверной валидации. Клиентской же как будто не делается.
0
4 / 4 / 1
Регистрация: 20.09.2012
Сообщений: 74
13.06.2017, 07:33  [ТС] 4
Разобрался, в чем была проблема - скрипты были подключены, но на мастер-странице - в частичном представлении подключал так:
C#
1
2
3
4
5
6
@section scripts
{
    @System.Web.Optimization.Scripts.Render("~/bundles/jqueryval")
    @System.Web.Optimization.Scripts.Render("~/bundles/jqueryplaceholder")
    @System.Web.Optimization.Scripts.Render("~/bundles/jqueryautosize")
}
Мастер-страница:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="shortcut icon" href="@Url.Content("~/Content/images/Icon.ico")" type="image/x-ico">
    @System.Web.Optimization.Styles.Render("~/Content/css")
    @System.Web.Optimization.Scripts.Render("~/bundles/modernizr")
</head>
<body>
    <div class="main">
        <div class="header">
            <h1>TITLE</h1>
        </div>
        <div class="content">
            @RenderBody()
            @System.Web.Optimization.Scripts.Render("~/bundles/jquery")
            @System.Web.Optimization.Scripts.Render("~/bundles/jqueryajax")
            @RenderSection("scripts", required: false)
            @System.Web.Optimization.Scripts.Render("~/bundles/ownScripts")
        </div>
    </div>
</body>
</html>
Когда подключаю скрипты прямо частичном представлении (без секции scripts):
C#
1
2
3
@System.Web.Optimization.Scripts.Render("~/bundles/jqueryval")
@System.Web.Optimization.Scripts.Render("~/bundles/jqueryplaceholder")
@System.Web.Optimization.Scripts.Render("~/bundles/jqueryautosize")
- все работает как нужно.

Но ведь подключать скрипты в частичном представлении - не правильно? Можно как-то по-другому сделать?
0
Эксперт .NET
12099 / 8410 / 1288
Регистрация: 21.01.2016
Сообщений: 31,718
13.06.2017, 07:35 5
AlikSoldier, скрипты на мастер-странице нужно подключать в тэге HEAD:

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="shortcut icon" href="@Url.Content("~/Content/images/Icon.ico")" type="image/x-ico">
    @System.Web.Optimization.Styles.Render("~/Content/css")
    @System.Web.Optimization.Scripts.Render("~/bundles/modernizr")
 
    @System.Web.Optimization.Scripts.Render("~/bundles/jquery")
    @System.Web.Optimization.Scripts.Render("~/bundles/jqueryajax")
    @System.Web.Optimization.Scripts.Render("~/bundles/ownScripts")
    @RenderSection("scripts", required: false)  <-- ВОТ ТУТ НУЖНО ДЕРЖАТЬ СКРИПТЫ
</head>
<body>
    <div class="main">
        <div class="header">
            <h1>TITLE</h1>
        </div>
        <div class="content">
            @RenderBody()
        </div>
    </div>
</body>
</html>
0
4 / 4 / 1
Регистрация: 20.09.2012
Сообщений: 74
13.06.2017, 10:56  [ТС] 6
Цитата Сообщение от Usaga Посмотреть сообщение
AlikSoldier, скрипты на мастер-странице нужно подключать в тэге HEAD:
Да, спасибо. Я учту. Но это все равно не помогло
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,734
13.06.2017, 13:28 7
На счет скриптов в хеадере
https://habrahabr.ru/post/182310/
- если резюмировать , то либо в конце документа , либо с директивой async.

Добавлено через 5 минут
Цитата Сообщение от AlikSoldier Посмотреть сообщение
Но ведь подключать скрипты в частичном представлении - не правильно?
правильно , когда эти скрипты используются только этим частичным представлением , принцип COP.
https://habrahabr.ru/company/yandex/blog/276035/ (БЭМ от яндекса)
0
13.06.2017, 13:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2017, 13:28
Помогаю со студенческими работами здесь

DropDownList и валидация
Здравствуйте, столкнулся с такой проблемой: Есть на странице у нас некоторые поля типа...

Валидация данных
Имеется обычная форма для изменения Price (decimal) с client validation. Когда вводишь через...

Валидация данных
Здравствуйте, уважаемые форумчане! Итак, есть проблема: не получается провести валидацию данных в...

Ненавязчивая валидация
В форме есть числовое поле,если заполнить дробное число с запятой срабатывает ненавязивая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru