[MVC] Property name van class mag geen variable zijn

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 08:04
Goed, ik wist niet echt hoe ik de titel moest omschrijven maar dit dekt de lading hopelijk wel.
Ik loop een beetje tegen een vreemd issue aan wat mij persoonlijk niet echt logisch lijkt.
Mogelijk kan iemand het iets voor mij verhelderen.

Stel even de volgende class voor:
C#:
1
2
3
4
5
6
    public class Person
    {
        public int id { get; set; }
        public string Naam { get; set; }
        public string Wachtwoord { get; set; }
    }


Met daarbij de volgende controller functies voor create:
C#:
1
2
3
4
5
6
7
8
9
10
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(Person Naam)
        {
            return View();
        }


De code is redelijk recht toe recht aan en lijkt weinig mis mee, echter zodra ik nu submit, dan is mijn model leeg.
Als ik de variable achter Person verander naar bijvoorbeeld Model dan werkt het wel, verander ik deze naar Wachtwoord dan werkt deze weer niet.

Is er een specifieke reden voor dat dit niet mogelijk is?
Of ben ik hier toch tegen een bug aangelopen.

Imho zie ik weinig verkeerd aan bijvoorbeeld
String volledigenaam = Naam.Naam; (afgezien van de rare variabele benoeming dan natuurlijk)

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 11-10 19:53

Ventieldopje

I'm not your pal, mate!

Je model is alleen een "container" van vastgestelde data (id, naam wachtwoord in dit geval). Die moet je nog wel naar de database schrijven in je Create actie, of bedoel je dat de model die je door krijgt als argument ook leeg is?

Probeer ook de argumenten in lower camel case te schrijven (eerste letter een kleine letter). Dit voorkomt verwarring met bestaande klassen (zoals Person).

offtopic:
Waarom schrijf je eigenlijk Person maar dan wel met Naam en Wachtwoord, waarom niet Username en Password?

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 08:04
Ventieldopje schreef op donderdag 19 mei 2016 @ 15:15:
Je model is alleen een "container" van vastgestelde data (id, naam wachtwoord in dit geval). Die moet je nog wel naar de database schrijven in je Create actie, of bedoel je dat de model die je door krijgt als argument ook leeg is?

Probeer ook de argumenten in lower camel case te schrijven (eerste letter een kleine letter). Dit voorkomt verwarring met bestaande klassen (zoals Person).

offtopic:
Waarom schrijf je eigenlijk Person maar dan wel met Naam en Wachtwoord, waarom niet Username en Password?
Naja het hele model is gewoon leeg in dit geval (NULL), lowercase maakt niet uit trouwens.

Betreffende je vraag, ik kwam er per ongeluk achter via een ander project waarbij de naamgeving wel overeenkomt, maar er ook een property met die naamgeving in de class stond.
Kostte me een 45 minuten zoeken 8)7
Daarna ben ik het gaan reproduceren.

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 22:50

Cyphax

Moderator LNX
Ik denk aan een bugje in de modelbinder... deze: http://stackoverflow.com/...net-mvc-4-modelbinder-bug wellicht? Probeer de voorgestelde oplossing daar eens? Om te kijken of dat scheelt?

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:41

Haan

dotnetter

Hoe ziet de view er uit? Gebruik je daar wel de zelfde naamgeving voor de properties op het model?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 08:04
Cyphax schreef op donderdag 19 mei 2016 @ 15:28:
Ik denk aan een bugje in de modelbinder... deze: http://stackoverflow.com/...net-mvc-4-modelbinder-bug wellicht? Probeer de voorgestelde oplossing daar eens? Om te kijken of dat scheelt?
Daar lijkt het inderdaad wel grotendeels op, afgezien dat zijn methode iets anders is.
Echter is het ook wel mogelijk voor ons om er omheen te werken nu we het weten.
Haan schreef op donderdag 19 mei 2016 @ 15:38:
Hoe ziet de view er uit? Gebruik je daar wel de zelfde naamgeving voor de properties op het model?
Ik zal de view niet volledig posten (Zelfs de scaffolded view is nogal aan formaat) dus heb hem even gestript van opmaak
De hooflijnen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@model WebApplication3.Models.Person

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <h4>Person</h4>
        @Html.LabelFor(model => model.Naam, htmlAttributes: new { @class = "control-label col-md-2" })
        @Html.EditorFor(model => model.Naam, new { htmlAttributes = new { @class = "form-control" } })

        @Html.LabelFor(model => model.Wachtwoord, htmlAttributes: new { @class = "control-label col-md-2" })
        @Html.EditorFor(model => model.Wachtwoord, new { htmlAttributes = new { @class = "form-control" } })
        <input type="submit" value="Create" class="btn btn-default" />
}

Acties:
  • 0 Henk 'm!

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Omdat je parameternaam overeenkomt met de naam van een van de properties van je model denk ik dat de ModelBinder niet weet of je nou alle properties los als parameter in je action hebt staan, of dat je een model probeert te posten.

ASP.NET MVC is voor een groot gedeelte gebaseerd op conventies. Door je model dezelfde naam te geven als een van de properties van datzelfde model kan ik me voorstellen dat je het de default ModelBinder (te) moeilijk maakt om de juiste conventie te vinden.

Geef je model 'gewoon' een naam die niet in een van je properties voorbij komt en je zou geen probleem moeten hebben. Create(Person person) lijkt me prima :+

My personal website


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 08:04
OZ-Gump schreef op donderdag 19 mei 2016 @ 16:04:
Omdat je parameternaam overeenkomt met de naam van een van de properties van je model denk ik dat de ModelBinder niet weet of je nou alle properties los als parameter in je action hebt staan, of dat je een model probeert te posten.

ASP.NET MVC is voor een groot gedeelte gebaseerd op conventies. Door je model dezelfde naam te geven als een van de properties van datzelfde model kan ik me voorstellen dat je het de default ModelBinder (te) moeilijk maakt om de juiste conventie te vinden.

Geef je model 'gewoon' een naam die niet in een van je properties voorbij komt en je zou geen probleem moeten hebben. Create(Person person) lijkt me prima :+
Eens, Naam.Naam is dan ook een slecht voorbeeld, echter de reden dat ik erop kwam was als volgt
*Onnodige zooi eruit gehaald.

De metadata class (deze is database generated, losse metadata classe aangemaakt voor annotaties)
C#:
1
2
3
4
5
6
7
    public class OmschrijvingenMetaData
    {
        public string Omschrijving { get; set; }
    }

    [MetadataType(typeof(OmschrijvingenMetaData))]
    public partial class T_OMSCHRIJVING {}


de controller (T_Omschrijving is de database tabel naam)
C#:
1
2
3
4
5
        [HttpPost]
        public ActionResult Create(T_OMSCHRIJVING omschrijving)
        {
            return View();
        }


Dit zal dus niet werken, maar is wel een degelijke naamgevingsconventie.

Acties:
  • +1 Henk 'm!

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Heb je situatie net nagemaakt: twee maal een T_OMSCHRIJVING partial class, waarvan 1 met een Omschrijving property. Daarnaast een OmschrijvingenMetadata class met een Omschrijving property die als MetadataType aan een van de twee partials hangt.

Zoals je ziet: weer tweemaal een omschrijving property. En je parameter heet..... yup: omschrijving.

Noem je parameter t_omschrijving en er is geen issue; komt eigenlijk op hetzelfde neer als de vorige post :+

My personal website

Pagina: 1