Add `FormContext` to `ViewContext`

- start with `FormContext` and classes it needs from legacy world
- FYI `ModelClientValidationRule` came from Web Pages; the rest from MVC

Cleanup and make files compile in new world
- remove `FormContext.GetJsonValidationMetadata` method; will file an
  issue to revive this using Json.NET
- don't store `FormContext` in the `HttpContext`, no longer have child
  actions
- do `null` checks in setters, not getters (minor perf improvement)
- fix namespaces and usings
- wrap long lines; use `[NotNull]`; no copyright notice
- use explicit comparers for dictionaries
- add XML comment for odd `ModelClientValidationRule.ValidationType`
  property
- Collection -> List
This commit is contained in:
dougbu 2014-03-28 17:01:23 -07:00
parent 54c73e4227
commit 94db3c392a
4 changed files with 140 additions and 2 deletions

View File

@ -0,0 +1,27 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace Microsoft.AspNet.Mvc.ModelBinding
{
public class FieldValidationMetadata
{
private readonly List<ModelClientValidationRule> _validationRules =
new List<ModelClientValidationRule>();
private string _fieldName = string.Empty;
public string FieldName
{
get { return _fieldName; }
set { _fieldName = value ?? string.Empty; }
}
public bool ReplaceValidationMessageContents { get; set; }
public string ValidationMessageId { get; set; }
public IList<ModelClientValidationRule> ValidationRules
{
get { return _validationRules; }
}
}
}

View File

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
namespace Microsoft.AspNet.Mvc.ModelBinding
{
public class ModelClientValidationRule
{
private readonly Dictionary<string, object> _validationParameters =
new Dictionary<string, object>(StringComparer.Ordinal);
private string _validationType = string.Empty;
public string ErrorMessage { get; set; }
public IDictionary<string, object> ValidationParameters
{
get { return _validationParameters; }
}
/// <summary>
/// Identifier of the <see cref="ModelClientValidationRule"/>. If client-side unobtrustive validation is
/// enabled, use this <see langref="string"/> as part of the generated "data-val" attribute name. Must be
/// unique in the set of enabled validation rules.
/// </summary>
public string ValidationType
{
get { return _validationType; }
set { _validationType = value ?? string.Empty; }
}
}
}

View File

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNet.Mvc.ModelBinding;
namespace Microsoft.AspNet.Mvc.Rendering
{
public class FormContext
{
private readonly Dictionary<string, FieldValidationMetadata> _fieldValidators =
new Dictionary<string, FieldValidationMetadata>(StringComparer.Ordinal);
private readonly Dictionary<string, bool> _renderedFields =
new Dictionary<string, bool>(StringComparer.Ordinal);
public IDictionary<string, FieldValidationMetadata> FieldValidators
{
get { return _fieldValidators; }
}
public string FormId { get; set; }
public bool ReplaceValidationSummary { get; set; }
public string ValidationSummaryId { get; set; }
public FieldValidationMetadata GetValidationMetadataForField([NotNull] string fieldName)
{
return GetValidationMetadataForField(fieldName, createIfNotFound: false);
}
public FieldValidationMetadata GetValidationMetadataForField([NotNull] string fieldName, bool createIfNotFound)
{
FieldValidationMetadata metadata;
if (!FieldValidators.TryGetValue(fieldName, out metadata))
{
if (createIfNotFound)
{
metadata = new FieldValidationMetadata()
{
FieldName = fieldName
};
FieldValidators[fieldName] = metadata;
}
}
return metadata;
}
public bool RenderedField([NotNull] string fieldName)
{
bool result;
_renderedFields.TryGetValue(fieldName, out result);
return result;
}
public void RenderedField([NotNull] string fieldName, bool value)
{
_renderedFields[fieldName] = value;
}
}
}

View File

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNet.Abstractions;
@ -9,15 +9,35 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
private DynamicViewData _viewBag;
public ViewContext(IServiceProvider serviceProvider, HttpContext httpContext, IDictionary<string, object> viewEngineContext)
// We need a default FormContext if the user uses html <form> instead of an MvcForm
private readonly FormContext _defaultFormContext = new FormContext();
private FormContext _formContext;
public ViewContext(IServiceProvider serviceProvider, HttpContext httpContext,
IDictionary<string, object> viewEngineContext)
{
ServiceProvider = serviceProvider;
HttpContext = httpContext;
ViewEngineContext = viewEngineContext;
_formContext = _defaultFormContext;
}
public IViewComponentHelper Component { get; set; }
public virtual FormContext FormContext
{
get
{
return _formContext;
}
set
{
// Never return a null form context, this is important for validation purposes.
_formContext = value ?? _defaultFormContext;
}
}
public HttpContext HttpContext { get; private set; }
public IServiceProvider ServiceProvider { get; private set; }