• 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
311 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 (273,730 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,260 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 (273,730 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 (273,730 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ź 260 wizyt
pytanie zadane 2 marca 2020 w C# przez Moras Obywatel (1,620 p.)
0 głosów
1 odpowiedź 558 wizyt
pytanie zadane 27 maja 2019 w C# przez Ditrix Mądrala (5,650 p.)
0 głosów
0 odpowiedzi 78 wizyt
pytanie zadane 4 marca w C# przez drewienko Nowicjusz (120 p.)

92,757 zapytań

141,679 odpowiedzi

320,437 komentarzy

62,101 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

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!

...