Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[EF / C#] Required Attribute wordt genegeerd

Pagina: 1
Acties:

  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 10:14
Zie onderstaande code:
C#:
1
2
3
[Required]
[StringLength(13, ErrorMessageResourceType = typeof (ValidationMessages), ErrorMessageResourceName = "MinimumStringLength", MinimumLength = 1)]
public String ArticleCode { get; set; }


Wanneer ik het StringLength attribuut weglaat en ik schiet een object in zonder ArticleCode, krijg ik keurig een foutmelding dat ArticleCode verplicht is.

Zet ik het StringLengthAttribuut terug en schiet hetzelfde object in, wordt mijn modelstate als valid beschouwd. :?

Schiet mij maar lek. 8)7

Jullie een idee?

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Maak je gebruik van ValidateObject(instance, validationContext, validateAllProperties: true)? Zo niet, dan wordt alleen het eerste attribuut gevalideerd.

Via: http://stackoverflow.com/...doesnt-seem-to-be-working

  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 10:14
Ehm nee. Mijn HttpPost methode ziet er als volgt uit. Het gaat om een Web API overigens.
En hier geeft ModelState.IsValid dus aan dat de waarde valide is. Terwijl dit dus niet het geval is.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[HttpPost]
public IHttpActionResult PostArticle(Article paramArticle)
{
    // Validate modelstate
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    //TODO PB: validate for under and overposting
    //TODO PB: validate values. If not valid, return result with error messages. Set validation rules in Article class

    // Store article in datacontext
    var result = Articles.DataAccessLayer.ArticleDal.AddArticle(paramArticle);

    // Log message
    result.LogApiMessages();

    // Return result
    return Ok(result);
}


--edit--

de post zoals ik deze in Fiddler doe:

Request Headers:
User-Agent: Fiddler
Host: localhost:49998
Content-Type: application/json; charset=utf-8

Request Body:
{"ArticleCode":""}

[ Voor 12% gewijzigd door PdeBie op 07-07-2014 10:38 ]


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Wat gebeurd er als je het Required attribuut weglaat? Je hebt al een minlength van 1 dus het required attribuut lijkt me eigenlijk helemaal niet nodig, of wel?

Mijn iRacing profiel


  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 10:14
Net even geprobeerd, maar ook dan zegt hij dat de modelstate valid is.

Afbeeldingslocatie: http://i.imgur.com/vUESds1.png
NickThissen schreef op maandag 07 juli 2014 @ 11:44:
Je hebt al een minlength van 1 dus het required attribuut lijkt me eigenlijk helemaal niet nodig, of wel?
Ik weet alleen niet of die validatie ook af gaat op het moment dat je geen ArticleCode mee geeft (under posting). Daarom dat ik die required heb toegevoegd.

[ Voor 60% gewijzigd door PdeBie op 07-07-2014 11:54 ]


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Dit is standaard gedrag van de WebApi.

Wat er gebeurd is dat de var paramArticle null is, waardoor de validations op het object Article niet getriggerd worden. Daarom is je ModelState valid.

Dit is een scenario wat je zelf moet afhandelen. Of schrijf een actionfilter welke dit voor je afhandeld.

Geen idee of dit in MVC ook van dit Under Posting scenario "last" heeft overigens. Nooit tegenaan gelopen..

[ Voor 15% gewijzigd door D-Raven op 07-07-2014 12:00 ]


  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 10:14
D-Raven schreef op maandag 07 juli 2014 @ 11:56:
Dit is standaard gedrag van de WebApi.

Wat er gebeurd is dat de var paramArticle null is, waardoor de validations op het object Article niet getriggerd worden. Daarom is je ModelState valid.

Dit is een scenario wat je zelf moet afhandelen. Of schrijf een actionfilter welke dit voor je afhandeld.
Maar paramArticle is helemaal niet null.
paramArticle

Ik heb overigens (puur ter test) de POST eens aangepast en in plaats van ArticleCode doe ik nu dezelfde test met de property Name (ook van het type String). Ik verwachte geen verschil en gelukkig is dit er ook niet. Maar mijn voorbeelden zijn vanaf nu dus even met de property Name, dat jullie niet denken van 'huh? was toch ArticleCode?'

Maar ik zie wel wat anders. Ik heb de validatie op de property aangepast.

Van
C#:
1
2
3
[Required]
[StringLength(50, ErrorMessageResourceType = typeof (ValidationMessages), ErrorMessageResourceName = "MinimumStringLength", MinimumLength = 1)]
public String Name { get; set; }


Naar
C#:
1
2
3
4
5
//[Required]
//[StringLength(50, ErrorMessageResourceType = typeof (ValidationMessages),
//    ErrorMessageResourceName = "MinimumStringLength", MinimumLength = 1)]
[StringLength(50, ErrorMessage = "Test foutmelding", MinimumLength = 1)]
public String Name { get; set; }


Het verschil zit hem dus in het required attribuut en in de foutmelding. De foutmelding kwam eerst uit een resource en nu is het gewoon een String. En wat denk je!?

Afbeeldingslocatie: http://tweakers.net/ext/f/IiL9howUidQqsfSoqV1lbOC8/full.png

Afbeeldingslocatie: http://tweakers.net/ext/f/breAt7k7U0YwZgL8PVHySeEl/full.png

8)7 8)7 8)7

Zet ik het required attribuut terug is de modelstate nog steeds invalid. En krijg ik keurig twee foutmeldingen in m'n response.
Afbeeldingslocatie: http://tweakers.net/ext/f/d5wlkr52gHUdzDnMUURolSQI/full.png

Zet ik de foutmelding terug naar de tekst uit de resourcefiles, dan is hij wel valid! |:( 8)7

[ Voor 7% gewijzigd door PdeBie op 07-07-2014 12:15 ]


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Gebruik je misschien een custom modelbinder ?

Verder is het "vage shit". :P

[ Voor 26% gewijzigd door D-Raven op 07-07-2014 13:43 ]


  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 10:14
Nope, dit is echt recht-toe recht-aan werk.

Ik heb gewoon een klasse 'Article' met daarin wat properties en geen vage DataAnnotations of iets dergelijks.


Eerste dingetje ook wat ik maak in Web API overigens.

--edit @ vage shit regel--
Behoorlijk! :P

[ Voor 48% gewijzigd door PdeBie op 07-07-2014 13:45 ]


  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 10:14
Geen idee waarom, maar na het cleanen van mijn solution en het opnieuw toevoegen van de DefaultModelBinder() aan de Application_Start() in de Global.asax werkt het ineens wel. Validatie gaat nu keurig af.

Alleen nu haalt hij de tekst nog niet uit mijn resource file, maar dat is een nieuwe uitdaging.

Bedankt voor het meedenken allemaal!
Pagina: 1