2008-12-15 4 views
6

Ich benutze das ModelStateDictionary in asp.net mvc derzeit, um Validierungsfehler zu halten und dann an den Benutzer zurück zu übergeben. In der Lage zu überprüfen, ob das gesamte Modell mit ModelState.IsValid gültig ist, ist besonders. Eine aktuelle Anwendung, an der ich gerade arbeite, muss jedoch Warnungen melden können. Diese sind nicht so kritisch, so dass der Formularinhalt immer noch gespeichert werden kann, aber sie sollten dem Benutzer angezeigt werden, damit die Aktion optional ausgeführt werden kann.Modellwarnungen in ASP.NET MVC

Ich habe durch den Rahmen gesucht, um zu sehen, ob es irgendeinen offensichtlichen Platz gibt, um es zu erweitern, um mir zu erlauben, dies zu tun. Ich denke, dass ein anderes Wörterbuch mit Warnungen in und einer Unterklasse des Modellfehlers Modellwarnung genannt wird. Ich bin mir nicht sicher, wie ich das Framework erhalten würde, um meine neuen Container-Klassen in der Ansicht usw. zu verwenden, aber ich möchte immer noch alle vorhandenen Fehler-Sachen funktionieren.

Wenn jemand etwas Ähnliches versucht hat oder irgendwelche Gedanken hat, würde ich ihre Eingabe schätzen.

Update:

Ich habe so weit gekommen, wie der Viewdatadictionary erstreckt einige Warnungen

public class AetherViewDataDictionary : ViewDataDictionary 
{ 
    public AetherViewDataDictionary() 
    { 
     ModelStateWarning = new ModelStateDictionary(); 
    } 

    public AetherViewDataDictionary(object model) : base(model) 
    { 
     ModelStateWarning = new ModelStateDictionary(); 
    } 

    public AetherViewDataDictionary(ViewDataDictionary viewDataDictionary) : base(viewDataDictionary) 
    { 
     ModelStateWarning = new ModelStateDictionary(); 
    } 

    public ModelStateDictionary ModelStateWarning { get; private set; } 
} 

Das Problem hinzufügen, die ich jetzt habe, ist, dass, wenn ich zu meiner Ansicht Code zu erhalten, diese nur für debug Ich verliere die Tatsache, dass es mein neuer Typ ist, also wenn ich versuche, es zurück zu werfen und Zugang zu meinem neuen Wörterbuch zu bekommen, habe ich keine Freude.

Es setzt es hier richtig, aber wenn ich den Typ überprüfe, ist es weg.

Bearbeiten: Dies erwies sich als eine dumme Art und Weise, Dinge zu tun, siehe Antwort unten.

Antwort

6

So ist die Strecke, die ich vor dem Weg nach unten erwies sich als eine schlechte Idee zu sein, gibt es einfach nicht genug Zugang im Rahmen an den Bits zu erhalten, die Sie benötigen. Zumindest nicht ohne das Rad ein paar Mal neu zu erfinden.

Ich beschloss, den Weg zu dem Kopf nach unten der Modelklasse erstreckt, um eine Warnung Sammlung, um es hinzuzufügen:

public class AetherModelState : ModelState 
{ 
    public AetherModelState() { } 

    public AetherModelState(ModelState state) 
    { 
     this.AttemptedValue = state.AttemptedValue; 

     foreach (var error in state.Errors) 
      this.Errors.Add(error); 
    } 

    private ModelErrorCollection _warnings = new ModelErrorCollection(); 

    public ModelErrorCollection Warnings { get { return this._warnings; } } 
} 

Um leicht zu können Warnungen in der gleichen Art und Weise hinzufügen, die Sie mich geschaffen würden Fehler einige Erweiterungsmethoden für die Modelstate:

public static class ModelStateDictionaryExtensions 
{ 
    public static void AddModelWarning(this ModelStateDictionary msd, string key, Exception exception) 
    { 
     GetModelStateForKey(key, msd).Warnings.Add(exception); 
    } 

    public static void AddModelWarning(this ModelStateDictionary msd, string key, string errorMessage) 
    { 
     GetModelStateForKey(key, msd).Warnings.Add(errorMessage); 
    } 

    private static AetherModelState GetModelStateForKey(string key, ModelStateDictionary msd) 
    { 
     ModelState state; 
     if (string.IsNullOrEmpty(key)) 
      throw new ArgumentException("key"); 

     if (!msd.TryGetValue(key, out state)) 
     { 
      msd[key] = state = new AetherModelState(); 
     } 

     if (!(state is AetherModelState)) 
     { 
      msd.Remove(key); 
      msd[key] = state = new AetherModelState(state); 
     } 

     return state as AetherModelState; 
    } 

    public static bool HasWarnings(this ModelStateDictionary msd) 
    { 
     return msd.Values.Any<ModelState>(delegate(ModelState modelState) 
     { 
      var aState = modelState as AetherModelState; 
      if (aState == null) return true; 
      return (aState.Warnings.Count == 0); 
     }); 
    } 
} 

der GetModelStateForKey Code ist ropey aber Sie sollten sehen können, wo ich mit diesem geleitet werde. Als nächstes müssen Sie einige Erweiterungsmethoden schreiben, mit denen ich die Warnungen zusammen mit den Fehlern anzeigen kann.

+0

Was ist AttemptedValue? –

+0

Auch "if (aState == null) gibt true zurück;" Zeile ist falsch. Wir sollten True zurückgeben, wenn und nur wenn die zugehörige Kollektion mindestens einen Artikel enthält. Also sollten Sie diese Zeile entfernen und die nächste Zeile in "return (aState! = Null && aState.Warnings.Count> 0);" –

4

Warum nicht einfach eine Liste mit Warnungen oder einem Wörterbuch zu den ViewData hinzufügen und sie dann in Ihrer Ansicht anzeigen?

z.B.

ViewData[ "warnings" ] = new[] { "You need to snarfle your aardvark" } ;