Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
GENDALF_ISTARI
10 / 27 / 19
Регистрация: 20.08.2013
Сообщений: 715
1

System.ComponentModel.DataAnnotations передача ошибки ValidationAttribute

07.10.2016, 20:50. Просмотров 708. Ответов 15
Метки нет (Все метки)

System.ComponentModel.DataAnnotations передача ошибки ValidationAttribute

если унаследоваться от ValidationAttribute то будет доступно ErrorMessage

ObjectTest.cs
C#
1
2
3
4
5
6
7
8
9
    public class ObjectTest:ValidationAttribute
    {
        [Required(ErrorMessage = "Поле Email не должно быть пустым")]
        public string Email { get; set; }
 
        [Required(ErrorMessage = "Поле URLAdress не должно быть пустым")]
        public string URLAdress { get; set; }
 
    }

HomeController.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public ActionResult Page1()
        {
            return View();
        }
 
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Page1(ObjectTest obj)
        {
            //ErrorMessage доступен
            ViewBag.ErrorMsg = obj.ErrorMessage;
            
            return View();
        }
Представление Page1.cshtml
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
25
26
27
28
29
30
31
32
33
34
35
36
@model Test_DataAnotation.Models.ObjectTest
@{
    ViewBag.Title = "Page1";
}
<style>
 .Error_Color {
     color: red;
 }  
 .Error_CODE {
     color: blue;
 } 
</style>
<link>@Html.ActionLink("Назад на Главную", "Index", "Home")</link><br/>
<h2>Page1</h2><br/>
<h1 class="Error_CODE">@ViewBag.ErrorMsg</h1><br/>
@{
    using (Html.BeginForm("Page1", "Home", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div class="form-group">
            @Html.LabelFor(Usermodel => Usermodel.Email, new {@class = "control-label"})
            @Html.TextBoxFor(Usermodel => Usermodel.Email, new {@class = "form-control"})
            @Html.ValidationMessageFor(Usermodel => Usermodel.Email, "", new { @class = "control-label Error_Color" })
        </div>
 
        <div class="form-group">
            @Html.LabelFor(Usermodel => Usermodel.URLAdress, new {@class = "control-label"})
            @Html.TextBoxFor(Usermodel => Usermodel.URLAdress, new {@class = "form-control"})
            @Html.ValidationMessageFor(Usermodel => Usermodel.URLAdress, "", new { @class = "control-label Error_Color" })
        </div>
        <div class="form-group">
           <button type="submit" class="btn btn-danger btn-md btn-login fwb">Registration</button>
        </div>
    }
}
Фишка в том , чтоб получить ErrorMessage
и засунуть в указаный html тег
К сожалению получаеться ErrorMessage пустой даже при ошибках
как передать не извесно
если это не возможно то тогда прийдеться писать свой DataAnnotations
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2016, 20:50
Ответы с готовыми решениями:

System.ComponentModel.DataAnnotations передача ошибки через обьект
System.ComponentModel.DataAnnotations передача ошибки через обьект а как...

DataAnnotations и EntityFramework
Всем привет. В mvc есть такая штука как DataAnnotations для классов (валидация...

Комбинирование DataAnnotations и Fluent API (Code First)
Есть модель, у которой указываются следующие аттрибуты: // здесь указываю...

Ошибка перевода System.Xml.Linq.XElement в System.IConvertible
Не удалось привести тип объекта &quot;System.Xml.Linq.XElement&quot; к типу...

Как конвертировать System.Drawing.Image в System.Web.UI.WebControls.Image
Привет всем! Подскажите пожалуйста нужно конвертировать или привести к типу...

15
lvlkoo
.NET C#,ASP.NET MVC
449 / 397 / 185
Регистрация: 16.10.2010
Сообщений: 1,625
Завершенные тесты: 2
07.10.2016, 23:02 2
Дубль номер 2.

Обьясните вы наконец зачем вам из представления передавать сообщения об ошибке в контроллер? (Или что вы там хотите сделать)

Ну действительно такое чувство что вы хотите сделать дикий костыль
1
GENDALF_ISTARI
10 / 27 / 19
Регистрация: 20.08.2013
Сообщений: 715
08.10.2016, 00:31  [ТС] 3
Мне нужна ошибка)
скину поймешь
0
Usaga
Эксперт .NET
5129 / 3489 / 615
Регистрация: 21.01.2016
Сообщений: 13,872
Завершенные тесты: 2
08.10.2016, 01:02 4
GENDALF_ISTARI, тексты ошибок уже доступны в представлении в @Html.ValidationMessageFor.
1
GENDALF_ISTARI
10 / 27 / 19
Регистрация: 20.08.2013
Сообщений: 715
08.10.2016, 01:15  [ТС] 5
Я это знаю , и давно)
но он мне не так нужен
как реакция существование ошибки
что приостановит выполнения кода
или наоборот Звучать это будет так

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
public class ModelTest
    {
        
      public void Test(ObjectTest obj)
     {
 
      //ошибки нету можно выполнять
      if(obj.ErrorMessage==string.Empty)
      {
       // код
      }
 
      }
 
    }
 
public class ObjectTest:ValidationAttribute
    {
        [Required(ErrorMessage = "Поле Email не должно быть пустым")]
        public string Email { get; set; }
 
        [Required(ErrorMessage = "Поле URLAdress не должно быть пустым")]
        public string URLAdress { get; set; }
 
    }

Контроллер
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ModelTest mod=new ModelTest()
 
 
public ActionResult Page1()
        {
            return View();
        }
 
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Page1(ObjectTest obj)
        {
           //выполняем код с проверкой ошибки
            Response.Write(mod.Test(obj));
            
            return View();
        }
0
Usaga
Эксперт .NET
5129 / 3489 / 615
Регистрация: 21.01.2016
Сообщений: 13,872
Завершенные тесты: 2
08.10.2016, 01:25 6
GENDALF_ISTARI, у контроллера есть свойство ModelState, а у того есть IsValid. Оно устанавливается в true, если модель валидна и false, если не очень. Используй это в коде.
1
OwenGlendower
Супер-модератор
Эксперт .NET
9689 / 8432 / 3613
Регистрация: 17.03.2014
Сообщений: 16,892
Записей в блоге: 1
08.10.2016, 05:51 7
GENDALF_ISTARI, добавлю еще что наследовать модель от ValidationAttribute не надо т.к. это базовый класс для атрибутов валидации.
1
GENDALF_ISTARI
10 / 27 / 19
Регистрация: 20.08.2013
Сообщений: 715
08.10.2016, 08:12  [ТС] 8
Короче флаги засунуть bool в public void Test(ObjectTest obj)

ModelState, а у того есть IsValid
может сместить

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
public class ModelTest:HomeController
    {
        
      public void Test(ObjectTest obj)
     {
 
      //ошибки нету можно выполнять
      if(ModelState.IsValid)
      {
       // код
      }
 
      }
 
    }
 
public class ObjectTest:ValidationAttribute
    {
        [Required(ErrorMessage = "Поле Email не должно быть пустым")]
        public string Email { get; set; }
 
        [Required(ErrorMessage = "Поле URLAdress не должно быть пустым")]
        public string URLAdress { get; set; }
 
    }

чтоб выполнить Response.Write(mod.Test(obj));
C#
1
2
3
4
5
6
7
8
9
10
[HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Page1(ObjectTest obj)
        {
           //выполняем код с проверкой ошибки
            Response.Write(mod.Test(obj));
            
            return View();
        }
и не писать в контроллере
ModelState, а у того есть IsValid
как бы упростить)

Добавлено через 1 минуту
ModelState.IsValid он что реагирует на ошибки DataAnotation ?
0
Usaga
Эксперт .NET
5129 / 3489 / 615
Регистрация: 21.01.2016
Сообщений: 13,872
Завершенные тесты: 2
08.10.2016, 09:04 9
Лучший ответ Сообщение было отмечено GENDALF_ISTARI как решение

Решение

GENDALF_ISTARI, я ничего не понял, что ты написал. Отвечу только на то, что смог понять:
Цитата Сообщение от GENDALF_ISTARI Посмотреть сообщение
ModelState.IsValid он что реагирует на ошибки DataAnotation ?
DataAnnotation ничего не делает, это только набор атрибутов (маркеров), которые говорят связывателю модели (Data Binder) о том, как нужно валидировать полученные данные. Т.е. валидация происходит на стороне сервера, незадолго до того, как данные попадут в лапы к методу действия контроллера. Data Binder - механизм (который, к слову, можно заменить своим), который отображает полученные от пользователя данные на модель (необязательно именно класс) заявленную в сигнатуре метода действия контроллера. Если модель снабжена атрибутами DataAnnotation, то Data Binder выполнит проверку свойств, если что-то "не так", то он выставит False в свойство ModelState.IsValid.

Как-то так.
1
GENDALF_ISTARI
10 / 27 / 19
Регистрация: 20.08.2013
Сообщений: 715
08.10.2016, 16:00  [ТС] 10
Ух ты попробую))
скину

Добавлено через 55 минут
Тестанул не работает

Класс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class TestModel : Controller
    {
        public string GetHtml(ObjectMon obj)
        {
            string html = string.Empty;
            if (ModelState.IsValid)
            {
                html = "<h1>Уран 235</h1>";
            }
            return html;
        }
    }
 
 public class ObjectMon
    {
        [Required]
        public string Name { get; set; }
    }

Контроллер
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public ActionResult Page2()
        {
            return View();
        }
 
        TestModel mode=new TestModel();
 
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Page2(ObjectMon obj)
        {
            Response.Write(mode.GetHtml(obj));
            return View();
        }

Представление
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
25
26
27
28
29
30
31
32
33
@model Test_DataAnotation.Models.ObjectMon
@{
    ViewBag.Title = "Home Page";
}
<style>
    .Error_Color {
        color: red;
    }
    .Error_CODE {
        color: blue;
    }
</style>
<link>@Html.ActionLink("Назад на Главную", "Index", "Home")</link><br/>
 
<h1 class="Error_CODE">@ViewBag.ErrorMsg</h1><br/>
 
@{
    using (Html.BeginForm("Page2", "Home", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div class="form-group">
            @Html.LabelFor(Usermodel => Usermodel.Name, new {@class = "control-label"})
            @Html.TextBoxFor(Usermodel => Usermodel.Name, new {@class = "form-control"})
            @Html.ValidationMessageFor(Usermodel => Usermodel.Name, "", new { @class = "control-label Error_Color" })
        </div>
 
        
        <div class="form-group">
           <button type="submit" class="btn btn-danger btn-md btn-login fwb">Registration</button>
        </div>
    }
}
Пишет даже при ошибке = Уран 235
0
Usaga
Эксперт .NET
5129 / 3489 / 615
Регистрация: 21.01.2016
Сообщений: 13,872
Завершенные тесты: 2
09.10.2016, 12:48 11
GENDALF_ISTARI, чем бы не являлся класс TestModel - это точно не контроллер (как минимум, это видно по его названию). Какого лешего ты этот класс унаследовал от Contoller? Чтобы получить доступ к свойству ModelState? Ну так это делать нужно в коде метода действия настоящего контроллера, который обрабатывает запрос. Т.е. тут: public ActionResult Page2(ObjectMon obj).
1
GENDALF_ISTARI
10 / 27 / 19
Регистрация: 20.08.2013
Сообщений: 715
09.10.2016, 15:28  [ТС] 12
Ладно уболтал ) будет так )
0
Usaga
Эксперт .NET
5129 / 3489 / 615
Регистрация: 21.01.2016
Сообщений: 13,872
Завершенные тесты: 2
09.10.2016, 16:18 13
Цитата Сообщение от GENDALF_ISTARI Посмотреть сообщение
Ладно уболтал ) будет так )
Ты бы учебник, что ли, почитал по C# и по ASP.NET MVC. Это куда эффективнее, чем методом тыка работать.
1
GENDALF_ISTARI
10 / 27 / 19
Регистрация: 20.08.2013
Сообщений: 715
09.10.2016, 18:22  [ТС] 14
Не в тыке дело , а в понимании , не хочеться половину книги пролистать . я же не буду читать то что и так мне понятно )

Добавлено через 35 секунд
Кое че не знаю вот и спрашиваю)
0
Usaga
Эксперт .NET
5129 / 3489 / 615
Регистрация: 21.01.2016
Сообщений: 13,872
Завершенные тесты: 2
09.10.2016, 18:37 15
GENDALF_ISTARI, код, что ты выше привёл демонстрирует, что "кое чё" - это практически всё. Потому я и упомянул литературу.
1
GENDALF_ISTARI
10 / 27 / 19
Регистрация: 20.08.2013
Сообщений: 715
09.10.2016, 22:56  [ТС] 16
Я те скинул ЛС свистнишь мне в ЛС
думаю темка закрыта
0
09.10.2016, 22:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2016, 22:56

Как конвертировать обьект типа System.Drawing.Image в обьект System.Web.UI.WebControls.Image
Буду очень благодарен тому кто поможет

Inet Explorer при обнаружении ошибки вместо описания ошибки выдает иероглифы
Начал изучение ASP. Inet Explorer при обнаружении ошибки вместо описания ошибки...

Сложная валидация модели через System.ComponentModel.DataAnnotations
Мне нужно реализовать валидацию свойства, которая должна учесть значение...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru