Das Attribut [Bind (Exclude = “”)] verhindert ein Überbuchen nicht

Was ist der beste Weg, um ein Überposting von MVC 4 zu verhindern?

MS-Quellen zufolge soll das Attribut [Bind] die einfachste Möglichkeit sein, ein Überbuchen zu verhindern, indem verhindert wird, dass eingehende Formularwerte in die Datenbank gelangen. Mit der neuesten Version von MVC & EF scheint dies nicht wie erwartet / angekündigt zu funktionieren, es sei denn, ich vermisse etwas Wichtiges.

VonWrox Professional ASP.NET MVC 4 (Jon Galloways Kapitel 7), die folgende Klasse sollte ein Überposting verhindern:

[Bind(Exclude="IsAdmin")]
public class User
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public bool IsAdmin { get; set; }
}

Das Attribut [Bind] verhindert jedoch lediglich, dass die Formularübergabewerte an das Modell gebunden werden. Das Modell hat dann einen Leer- / Standardwert, der in die Datenbank zurückgeschrieben wird. In diesem Fall würde es sicherstellen, dass IsAdmin JEDES MAL, wenn Sie .SaveChanges () mit diesem Modell aufrufen, false ist. Alle "wahren" Werte werden überschrieben. Das ist ein RIESIGER Sicherheitsfehler.

Die alternative Syntax - Platzieren von [Bind] im Aktionsparameter des Edit-Controllers - bewirkt genau dasselbe:

public ActionResult Edit([Bind(Exclude = "IsAdmin")] User user)

Alle "wahren" Werte werden überschrieben, wenn .SaveChanges () aufgerufen wird. Dies widerspricht dem Blogeintrag von K. Scott Allen zum Thema:http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx

Die einzige Alternative scheint eine Flut von dedizierten ViewModels zu sein, die alle mit Automapper verbunden sind. Das ist zwar sicher, scheint aber ein massiver Kopfschmerz zu sein, insbesondere als:

Für die Aktionen "Erstellen", "Bearbeiten", "Indexieren" und "Detail" gelten möglicherweise unterschiedliche Anforderungen, für die unterschiedliche ViewModels erforderlich sindMöglicherweise müssen Sie einige schreibgeschützte Felder verfügbar machen (z. B. CreatedBy für die Aktion Bearbeiten), für die das Attribut [ReadOnly] für die Eigenschaft nicht verfügbar ist, da sie durch die Aktion Erstellen aktualisiert werden

Ich weiß, dass jemand antworten wird, indem er sagt, dass Sie solltennoch nie Binden von Datenmodellen an Ansichten. Dies ist jedoch das Standardverhalten von Vorlagen und die Art und Weise, wie dies in fast allen Dokumentationen gezeigt wird. Und außerdem sollte MVC + EF Leben macheneinfachernichtSchwererund ein Ozean von ModelView-Klassen, die mit AutoMapper verkabelt sind, ist nicht das, was ich für einfacher halte.

Weiß also jemand, wie man [Bind] wie angekündigt funktionieren lässt?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage