1 namespace System.Web.Mvc {
3 using System.Collections;
4 using System.Collections.Generic;
8 public class ModelStateDictionary : IDictionary<string, ModelState> {
10 private readonly Dictionary<string, ModelState> _innerDictionary = new Dictionary<string, ModelState>(StringComparer.OrdinalIgnoreCase);
12 public ModelStateDictionary() {
15 public ModelStateDictionary(ModelStateDictionary dictionary) {
16 if (dictionary == null) {
17 throw new ArgumentNullException("dictionary");
20 foreach (var entry in dictionary) {
21 _innerDictionary.Add(entry.Key, entry.Value);
27 return _innerDictionary.Count;
31 public bool IsReadOnly {
33 return ((IDictionary<string, ModelState>)_innerDictionary).IsReadOnly;
39 return Values.All(modelState => modelState.Errors.Count == 0);
43 public ICollection<string> Keys {
45 return _innerDictionary.Keys;
49 public ModelState this[string key] {
52 _innerDictionary.TryGetValue(key, out value);
56 _innerDictionary[key] = value;
60 public ICollection<ModelState> Values {
62 return _innerDictionary.Values;
66 public void Add(KeyValuePair<string, ModelState> item) {
67 ((IDictionary<string, ModelState>)_innerDictionary).Add(item);
70 public void Add(string key, ModelState value) {
71 _innerDictionary.Add(key, value);
74 public void AddModelError(string key, Exception exception) {
75 GetModelStateForKey(key).Errors.Add(exception);
78 public void AddModelError(string key, string errorMessage) {
79 GetModelStateForKey(key).Errors.Add(errorMessage);
83 _innerDictionary.Clear();
86 public bool Contains(KeyValuePair<string, ModelState> item) {
87 return ((IDictionary<string, ModelState>)_innerDictionary).Contains(item);
90 public bool ContainsKey(string key) {
91 return _innerDictionary.ContainsKey(key);
94 public void CopyTo(KeyValuePair<string, ModelState>[] array, int arrayIndex) {
95 ((IDictionary<string, ModelState>)_innerDictionary).CopyTo(array, arrayIndex);
98 public IEnumerator<KeyValuePair<string, ModelState>> GetEnumerator() {
99 return _innerDictionary.GetEnumerator();
102 private ModelState GetModelStateForKey(string key) {
104 throw new ArgumentNullException("key");
107 ModelState modelState;
108 if (!TryGetValue(key, out modelState)) {
109 modelState = new ModelState();
110 this[key] = modelState;
116 public bool IsValidField(string key) {
118 throw new ArgumentNullException("key");
121 // if the key is not found in the dictionary, we just say that it's valid (since there are no errors)
122 return DictionaryHelpers.FindKeysWithPrefix(this, key).All(entry => entry.Value.Errors.Count == 0);
125 public void Merge(ModelStateDictionary dictionary) {
126 if (dictionary == null) {
130 foreach (var entry in dictionary) {
131 this[entry.Key] = entry.Value;
135 public bool Remove(KeyValuePair<string, ModelState> item) {
136 return ((IDictionary<string, ModelState>)_innerDictionary).Remove(item);
139 public bool Remove(string key) {
140 return _innerDictionary.Remove(key);
143 public void SetModelValue(string key, ValueProviderResult value) {
144 GetModelStateForKey(key).Value = value;
147 public bool TryGetValue(string key, out ModelState value) {
148 return _innerDictionary.TryGetValue(key, out value);
151 #region IEnumerable Members
152 IEnumerator IEnumerable.GetEnumerator() {
153 return ((IEnumerable)_innerDictionary).GetEnumerator();