Asset/Site - CSS: / Styles For Validation Helpers
Asset/Site - CSS: / Styles For Validation Helpers
css
.input-validation-valid,.field-validation-valid,.validation-summary-
valid{display:none}
.input-validation-error{background:#fee;border:1px solid red; outline: none}
.input-validation-error:focus{outline:none}
input[type="text"].input-validation-error:focus, select.input-validation-
error:focus{outline:none}
.validation-summary-errors{color:red}
.validation-summary-errors span{font-weight:700}
.validation-summary-errors ul{list-style:disc inside}
.validation-summary-errors ul li{font-weight:normal}
Assets/Script/MicrosoftMvcJQueryValidation.js
// glue
function __MVC_ApplyValidator_Required(object) {
object["required"] = true;
}
function __MVC_CreateFieldToValidationMessageMapping(validationFields) {
var mapping = {};
return mapping;
}
function __MVC_CreateErrorMessagesObject(validationFields) {
var messagesObj = {};
case "stringLength":
jQueryValidationType = "maxlength";
break;
}
thisFieldMessages[jQueryValidationType] =
thisRule.ErrorMessage;
}
}
}
return messagesObj;
}
function __MVC_CreateRulesForField(validationField) {
var validationRules = validationField.ValidationRules;
case "regularExpression":
__MVC_ApplyValidator_RegularExpression(rulesObj,
thisRule.ValidationParameters["pattern"]);
break;
case "required":
if ($("#" +
validationField.FieldName).get(0).type !== 'checkbox') {
// only apply required if the input control
is NOT a checkbox.
__MVC_ApplyValidator_Required(rulesObj);
}
break;
case "stringLength":
__MVC_ApplyValidator_StringLength(rulesObj,
thisRule.ValidationParameters["maximumLength"]);
break;
default:
__MVC_ApplyValidator_Unknown(rulesObj,
thisRule.ValidationType,
thisRule.ValidationParameters);
break;
}
}
return rulesObj;
}
function __MVC_CreateValidationOptions(validationFields) {
var rulesObj = {};
for (var i = 0; i < validationFields.length; i++) {
var validationField = validationFields[i];
var fieldName = validationField.FieldName;
rulesObj[fieldName] = __MVC_CreateRulesForField(validationField);
}
return rulesObj;
}
function __MVC_EnableClientValidation(validationContext) {
// this represents the form containing elements to be validated
var theForm = $("#" + validationContext.FormId);
var options = {
errorClass: "input-validation-error",
errorElement: "span",
errorPlacement: function(error, element) {
var messageSpan =
fieldToMessageMappings[element.attr("name")];
$(messageSpan).empty();
$(messageSpan).removeClass("field-validation-valid");
$(messageSpan).addClass("field-validation-error");
error.removeClass("input-validation-error");
error.attr("_for_validation_message", messageSpan);
error.appendTo(messageSpan);
},
messages: errorMessagesObj,
rules: rulesObj,
success: function(label) {
var messageSpan = $
(label.attr("_for_validation_message"));
$(messageSpan).empty();
$(messageSpan).addClass("field-validation-valid");
$(messageSpan).removeClass("field-validation-error");
}
};
options = {
errorContainer: "#" + validationSummaryId,
errorLabelContainer: "#" + validationSummaryId + "
ul:first",
wrapper: "li",
if (this.numberOfInvalids() > 0) {
errContainer.removeClass("validation-summary-
valid").addClass("validation-summary-errors");
}
this.defaultShowErrors();
theForm.validate(options);
}
using System;
using System.Collections.Generic;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Text;
namespace ClientSideValSummary
{
public static class CustomValidationExtensions
{
public static MvcHtmlString ValidationSummaryJQuery(this
HtmlHelper htmlHelper, string message, IDictionary<string, object>
htmlAttributes)
{
if (!htmlHelper.ViewData.ModelState.IsValid)
return htmlHelper.ValidationSummary(message,
htmlAttributes); // use default Validation Summary rendering if ModelState is
invalid
divBuilder.AddCssClass(HtmlHelper.ValidationSummaryValidCssClassName);
// intentionally add VALID css class
if (!string.IsNullOrEmpty(message))
{
//-------------------------------------------------
-------------------------------
// Build an EMPTY error summary message <span
style="display:none"> tag
//-------------------------------------------------
-------------------------------
var spanBuilder = new TagBuilder("span");
//spanBuilder.MergeAttribute("style",
"display:none");
spanBuilder.SetInnerText(message);
sb.Append(spanBuilder.ToString(TagRenderMode.Normal)).Append(Environment.NewLin
e);
}
divBuilder.InnerHtml = sb.ToString();
return
MvcHtmlString.Create(divBuilder.ToString(TagRenderMode.Normal));
}
}
}
Code/ UrlHelperExtension.cs
using System;
using System.Web.Mvc;
namespace ClientSideValSummary
{
public static class UrlHelperExtension
{
/// <summary>
/// CSS Stylesheet file url.
/// </summary>
/// <param name="url">url helper</param>
/// <param name="filename">filename</param>
/// <returns>CSS Stylesheet file url</returns>
public static string Stylesheet(this UrlHelper url, string
filename)
{
return url.Content("~/Assets/css/" + filename);
}
/// <summary>
/// JavaScript file url.
/// </summary>
/// <param name="url">url helper</param>
/// <param name="filename">filename</param>
/// <returns>JavaScript file url</returns>
public static string JavaScript(this UrlHelper url, string
filename)
{
return url.Content("~/Assets/script/" + filename);
}
}
}
Controllers/ CustomerController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ClientSideValSummary.Models;
namespace ClientSideValSummary.Controllers
{
public class CustomerController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
IList<Customer> modelList = new List<Customer>
{
new
Customer { Id = 1, FirstName = "Foo 1", LastName = "Bar 1", ZipCode =
"12345" },
new
Customer { Id = 2, FirstName = "Foo 2", LastName = "Bar 2", ZipCode = "67890" }
};
return View(modelList);
}
return View(model);
}
[HttpPost]
public ActionResult Edit(Customer model)
{
// add the server-side error intentionally.
ModelState.AddModelError("FirstName", "This is my server-
side error.");
return View(model);
}
}
}
Models/ Customer.cs
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
namespace ClientSideValSummary.Models
{
public class Customer
{
public int Id { get; set; }
[Required]
[DisplayName("First Name")]
public string FirstName { get; set; }
[Required]
[DisplayName("Last Name")]
public string LastName { get; set; }
[Required]
[DisplayName("Zip Code")]
[StringLength(5, ErrorMessage = "{0} must be 5 character long.")]
[RegularExpression(@"\d{5}", ErrorMessage = "{0} must be five
digits.")]
public string ZipCode { get; set; }
[DisplayName("Email Address")]
[Required]
[DataType(DataType.EmailAddress)]
public string EmailAddress { get; set; }
}
}
Views/Customer/Edit.aspx
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.FirstName) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.FirstName) %>
<%= Html.ValidationMessageFor(model =>
model.FirstName, "*") %>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.LastName) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.LastName) %>
<%= Html.ValidationMessageFor(model =>
model.LastName, "*")%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmailAddress) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.EmailAddress) %>
<%= Html.ValidationMessageFor(model =>
model.EmailAddress, "*")%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.ZipCode) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.ZipCode) %>
<%= Html.ValidationMessageFor(model =>
model.ZipCode, "* Blah My Own Msg")%>
</div>
<p>
<input type="submit" name="submitButton"
value="Save" />
</p>
</fieldset>
<% } %>
<div>
<%= Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
Views/Customer/Index.aspx
</asp:Content>
Site.Master
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %><?xml
version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>
<asp:ContentPlaceHolder ID="TitleContent" runat="server" />
</title>
<link
href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/redmond/jquer
y-ui.css" rel="stylesheet" type="text/css" media="screen" />
<link href="<%= Url.Stylesheet("Site.css") %>" type="text/css"
rel="stylesheet" media="screen" />
</head>
<body>
<div id="page">
<div id="maincontent">
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
</div>
</div>
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"
type="text/javascript"></script>
<script
src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"
type="text/javascript"></script>
<script
src="https://ajax.microsoft.com/ajax/jQuery.Validate/1.6/jQuery.Validate.js"
type="text/javascript"></script>
<script type="text/javascript">
$(function() {
$("form").validate({
errorClass: "field-validation-error",
rules: {
"pledge.SupporterName": { required: true, maxlength: 50 },
"pledge.SupporterEmail": { required: true, email: true },
"pledge.Amount": { required: true, min: 10 }
},
messages: {
"pledge.Amount": { min: "Come on, you can give at least $10.00!" }
}
})
});
</script>