2011-01-17 7 views
0

Ich habe einen wierd/nervigen kleinen Bug, den ich nicht einmal richtig erklären kann, also verzeih mir, wenn das ein bisschen wortreich wird. Außerdem wurden Objekte zu ihrem Schutz umbenannt;)Unerwünschte Modellbindung im Custom Filter

Die MVC-Site, an der ich arbeite (ich habe sie nicht gestartet, ich arbeite gerade daran), hat ein benutzerdefiniertes Filterattribut, das einen Parameter in jede Aktion einfügt Methode, die mit diesem Filter dekoriert ist. Der Parameter enthält die Details des angemeldeten Benutzers, mit denen rollenbasierte Berechtigungen festgelegt werden. Siehe Beispiel unten:

[UserFilter] 
public ActionResult DoSomeStuffDependingOnPrivileges(string userId, UserObj user) 

Das UserObj ist ein Modell. Es sieht ein wenig wie folgt aus:

public class User 
{ 
    [DisplayName("User ID")] 
    public int UserID { get; set; } 

    ... 
    ... 
    ... 

    public IEnumerable<RoleModels.Role> Roles { get; set; } 
} 

Hier ist die benutzerdefinierte Aktion Filter:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.ActionParameters.ContainsKey(key)) 
    { 
     if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      var user = (User)filterContext.HttpContext.Session["User"]; 
      filterContext.ActionParameters[key] = user; 
     } 
    } 

    base.OnActionExecuting(filterContext); 
} 

So wie es funktioniert, ist, dass der Filter die UserObj Parameter aus der Sitzung gespeicherten Wert auffüllt. Es wird nicht vom Code übergeben, der die Aktionsmethode aufruft. Die Idee, die ich vermutete, war, den Code aufzuräumen oder zu zentralisieren oder eine solch edle Absicht.

Das Seltsame ist dies: Schau dir die Aktionsmethode an. Ich übergebe einen String-Parameter namens userId. Diese Benutzer-ID ist die ID eines anderen Benutzers als der im Parameter UserObj (denken Sie an eine Manager-Mitarbeiterbeziehung). Wenn der Aktionsfilter ausgeführt wird, füllt er den Benutzerparameter wie gewünscht auf, aber aus irgendeinem Grund füllt er die Benutzer-ID-Eigenschaft (int) des Benutzerparameters mit dem an die Aktionsmethode übergebenen userId-Parameter (string), wodurch der ModelState ungültig wird, obwohl ich wollte das UserObj-Modell nicht validieren.

Warum Larry warum!

Die Arbeit ist einfach genug. Das Umbenennen des userId-Parameters löst das Problem.

Meine Frage (endlich) ist diese: Wie, ohne Rückgriff auf die Aktion-Methode Parameternamen ändern, verhindere ich, dass dies geschieht?

Antwort

1

Haben Sie versucht mit BindAttribute?

+0

Hallo Jakub, Nein, ich habe nicht. Wie würde das in diesem Fall funktionieren? Ich bin ziemlich neu bei MVC, also würden viele kurze Wörter und Beispiele helfen;) – WernerVA

0

Danke Jakub.

Das Hinzufügen eines BindAttribute hat den Trick gemacht.

änderte ich die Aktionsmethode UserObj Parameter

public ActionResult DoSomeStuffDependingOnPrivileges(string userId, [Bind(Exclude = "userId")] UserObj user)