• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego model nie przechodzi walidacji ASP.NET

Object Storage Arubacloud
0 głosów
250 wizyt
pytanie zadane 5 stycznia 2023 w C# przez chrystian Gaduła (4,780 p.)

Bez if porgram działa poprawnie dodaje nowego Reviewera lecz gdy dochodzi do walidacji i pola są wszystkie pełne i spełniają warunek Required obsługiwany jest tylko !Model.IsValid4

Controller

 public IActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> Create([Bind("FullName,ProfilePicture,Note")]Reviewer reviewer)
        {
            if (!ModelState.IsValid)
            {
                return View(reviewer);
            }
            await _service.AddAsync(reviewer);
            return RedirectToAction(nameof(Index));
        }

Models/Reviewer
 

using System.ComponentModel.DataAnnotations;

namespace Project_ASPNET_14040.Models
{
    public class Reviewer
    {
        [Key]
        public int Id { get; set; }

        [Display(Name = "Profile Picture")]
        [Required(ErrorMessage = "Profile Picture is required")]
        public string ProfilePicture { get; set; }
        [Required(ErrorMessage = "Full Name is required")]
        [StringLength(50, MinimumLength = 3, ErrorMessage = "Full Name must be between 3 and 50 chars")]
        public string FullName { get; set; }

        [Display(Name = "Note")]
        [Required(ErrorMessage = "Note is required")]

        public string Note { get; set; }

        //Relations
        public List<BooksReviews> BooksReviews { get; set; }
    }
}

 

1 odpowiedź

0 głosów
odpowiedź 6 stycznia 2023 przez Wiciorny Ekspert (269,710 p.)
wybrane 11 stycznia 2023 przez chrystian
 
Najlepsza
if (!ModelState.IsValid)
           {
               return View(reviewer);
           }

spełniany tylko jest ten warunek dlatego, że po spełnieniu warunku masz RETURN...
Return kończy działanie całej funkcji asynchronicznej CREATE 

więc dlasza część kodu 
 

 await _service.AddAsync(reviewer);
           return RedirectToAction(nameof(Index));

nie może się wykonać.

komentarz 6 stycznia 2023 przez marcin99b Szeryf (82,080 p.)
ale ten return sie wykonuje kiedy model NIE JEST prawidłowy

a pytanie to było dlaczego nie jest prawidłowy, jeśli wszystkie warunki są spełnione
komentarz 6 stycznia 2023 przez Wiciorny Ekspert (269,710 p.)

Co ma spełnienie warunków :D do poprawnego modelu?
Warunki są spełnione mogą być np. na formularzu, czy względnie "bo tak uważa autor", że poprawnie wysyła zapytanie... a nie ma to nic wspólnego z tym, że model zostanie poprawnie przesłany i poprawnie uzupełniony jak wymaga od niego struktura kodu.
Sam program nie będzie wstanie się domyśleć, co autor zapytania ma na myśli -> sprawdzać będzie po kluczach, strukturze, i typie. 

no to model nie jest prawidłowy to masz prostą odpowiedź i powinieneś to przebukować.
Nie wiem jak uzupełniany jest model w jakie dane.

Zresztą... Bindujesz model dla ["FullName,ProfilePicture,Note")] dla Review, ale generalnie co bindujesz?
 

[Bind(Include = "FullName,ProfilePicture,Note")]

 

komentarz 7 stycznia 2023 przez chrystian Gaduła (4,780 p.)
Binduje properties do wysłania z View/Create

From 

<form asp-action="Create">
                    <div asp-validation-summary="ModelOnly" class="text-danger"></div>

                    <div class="form-group text-center">
                        <img id="ProfilePicturePreview"  class="border-info rounded-circle" style="max-width: 150px" />
                    </div>
                    <div class="form-group">
                        <label asp-for="ProfilePicture" class="control-label"></label>
                        <input asp-for="ProfilePicture" class="form-control" />
                        <span asp-validation-for="ProfilePicture" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label asp-for="FullName" class="control-label"></label>
                        <input asp-for="FullName" class="form-control" />
                        <span asp-validation-for="FullName" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label asp-for="Note" class="control-label"></label>
                        <input asp-for="Note" class="form-control" />
                        <span asp-validation-for="Note" class="text-danger"></span>
                    </div>

                    <div class="form-group">
                        <input type="submit" value="Create" class="btn btn-outline-success float-right" />
                        <a class="btn btn-outline-secondary" asp-action="Index">Show All</a>
                    </div>
                </form>

Wysyłam

ProfilePicture -> link
FullName -> XYZ XYZ

Note -> This is the note from third reviewer

komentarz 7 stycznia 2023 przez Wiciorny Ekspert (269,710 p.)
edycja 7 stycznia 2023 przez Wiciorny

Spróbuj uwzględnić tylko to co Ci potrzeba objęte klauzulą Include =  jak Ci napisałem, ewentualnie EXCLUDE na elementy które chcesz ignorować.
Wydaje mi się, że kontekst modelu oczekuje pełnej validacji.

A nie prościej Ci bedzie to sprwdzić debugując?
Aby sprawdzić, dlaczego ModelState.IsValid jest fałszywe, możesz przejrzeć komunikaty o błędach, które zostały dodane do ModelState przez walidator. Możesz to zrobić, wyświetlając listę błędów dla każdego pola w formularzu lub wyświetlając podsumowanie błędów za pomocą ValidationSummary helpera.

A sprawdzałeś czy MODEL ma zgodność plików?
ProfilePicture -> link
A oczekujesz string.
 

  public string ProfilePicture { get; set; }

nie ma tu zgodnosci typu dodaj [URL]
skoro tak jest 
 

[Display(Name = "Profile Picture")]
[Required(ErrorMessage = "Profile Picture is required")]
[URL]
        public string ProfilePicture { get; set; }

 

komentarz 7 stycznia 2023 przez chrystian Gaduła (4,780 p.)
edycja 7 stycznia 2023 przez chrystian

Dodająć [Url]
Dostaje wtedy 
 

Error tutaj:
builder.Services.AddDbContext<BookStoreDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnectionString")));

A próbojąc include 

[Bind(Include = "FullName,ProfilePicture,Note")]Reviewer reviewer)

komentarz 7 stycznia 2023 przez chrystian Gaduła (4,780 p.)
edycja 7 stycznia 2023 przez chrystian

Proszę o Instrukcje gdzie to znaleźć 

Możesz to zrobić, wyświetlając listę błędów dla każdego pola w formularzu

Nie wiem czy to jest validation summary ale dostaje coś takiego 

#region Assembly Microsoft.AspNetCore.Mvc.TagHelpers, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// C:\Program Files\dotnet\packs\Microsoft.AspNetCore.App.Ref\6.0.6\ref\net6.0\Microsoft.AspNetCore.Mvc.TagHelpers.dll
#endregion

namespace Microsoft.AspNetCore.Mvc.Rendering
{
    //
    // Summary:
    //     Acceptable validation summary rendering modes.
    public enum ValidationSummary
    {
        //
        // Summary:
        //     No validation summary.
        None = 0,
        //
        // Summary:
        //     Validation summary with model-level errors only (excludes all property errors).
        ModelOnly = 1,
        //
        // Summary:
        //     Validation summary with all errors.
        All = 2
    }
}

 

komentarz 10 stycznia 2023 przez chrystian Gaduła (4,780 p.)

Podobne pytania

0 głosów
1 odpowiedź 246 wizyt
pytanie zadane 2 marca 2020 w C# przez Moras Obywatel (1,620 p.)
0 głosów
1 odpowiedź 466 wizyt
pytanie zadane 27 maja 2019 w C# przez Ditrix Mądrala (5,650 p.)
0 głosów
0 odpowiedzi 45 wizyt
pytanie zadane 4 marca w C# przez drewienko Nowicjusz (120 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...