Skip to content

Instantly share code, notes, and snippets.

@jimmason
Last active August 29, 2015 14:22
Show Gist options
  • Save jimmason/f20f708ae2d0aa53d112 to your computer and use it in GitHub Desktop.
Save jimmason/f20f708ae2d0aa53d112 to your computer and use it in GitHub Desktop.
Nancy Html Extensions
// Nancy Input Extensions
//Stolen from https://github.com/JabbR/JabbR/blob/dev/JabbR/Nancy/InputExtensions.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using JabbR.Infrastructure;
using Nancy.Validation;
using Nancy.ViewEngines.Razor;
using PagedList;
using AntiXSS = Microsoft.Security.Application;
namespace JabbR
{
public static class HtmlHelperExtensions
{
public static IHtmlString CheckBox<T>(this HtmlHelpers<T> helper, string Name, bool value)
{
string input = String.Empty;
var checkBoxBuilder = new StringBuilder();
checkBoxBuilder.Append(@"<input id=""");
checkBoxBuilder.Append(AntiXSS.Encoder.HtmlAttributeEncode(Name));
checkBoxBuilder.Append(@""" data-name=""");
checkBoxBuilder.Append(AntiXSS.Encoder.HtmlAttributeEncode(Name));
checkBoxBuilder.Append(@""" type=""checkbox""");
if (value)
{
checkBoxBuilder.Append(@" checked=""checked"" />");
}
else
{
checkBoxBuilder.Append(" />");
}
checkBoxBuilder.Append(@"<input name=""");
checkBoxBuilder.Append(AntiXSS.Encoder.HtmlAttributeEncode(Name));
checkBoxBuilder.Append(@""" type=""hidden"" value=""");
checkBoxBuilder.Append(value.ToString().ToLowerInvariant());
checkBoxBuilder.Append(@""" />");
return new NonEncodedHtmlString(checkBoxBuilder.ToString());
}
public static IHtmlString ValidationSummary<TModel>(this HtmlHelpers<TModel> htmlHelper)
{
var validationResult = htmlHelper.RenderContext.Context.ModelValidationResult;
if (validationResult.IsValid)
{
return new NonEncodedHtmlString(String.Empty);
}
var summaryBuilder = new StringBuilder();
summaryBuilder.Append(@"<ul class=""validation-summary-errors"">");
foreach (var modelValidationError in validationResult.Errors)
{
foreach (var memberName in modelValidationError.MemberNames)
{
summaryBuilder.AppendFormat("<li>{0}</li>", modelValidationError.GetMessage(memberName));
}
}
summaryBuilder.Append(@"</ul>");
return new NonEncodedHtmlString(summaryBuilder.ToString());
}
public static IHtmlString ValidationMessage<TModel>(this HtmlHelpers<TModel> htmlHelper, string propertyName)
{
var errorsForField = htmlHelper.GetErrorsForProperty(propertyName).ToList();
if (!errorsForField.Any())
{
return new NonEncodedHtmlString(String.Empty);
}
return new NonEncodedHtmlString(errorsForField.First().GetMessage(propertyName));
}
public static IHtmlString AlertMessages<TModel>(this HtmlHelpers<TModel> htmlHelper)
{
const string message = @"<div class=""alert alert-{0}"">{1}</div>";
var alertsDynamicValue = htmlHelper.RenderContext.Context.ViewBag.Alerts;
var alerts = (AlertMessageStore)(alertsDynamicValue.HasValue ? alertsDynamicValue.Value : null);
if (alerts == null || !alerts.Messages.Any())
{
return new NonEncodedHtmlString(String.Empty);
}
var builder = new StringBuilder();
foreach (var messageDetail in alerts.Messages)
{
builder.AppendFormat(message, messageDetail.Key, messageDetail.Value);
}
return new NonEncodedHtmlString(builder.ToString());
}
internal static IEnumerable<ModelValidationError> GetErrorsForProperty<TModel>(this HtmlHelpers<TModel> htmlHelper,
string propertyName)
{
var validationResult = htmlHelper.RenderContext.Context.ModelValidationResult;
if (validationResult.IsValid)
{
return Enumerable.Empty<ModelValidationError>();
}
var errorsForField =
validationResult.Errors.Where(
x => x.MemberNames.Any(y => y.Equals(propertyName, StringComparison.InvariantCultureIgnoreCase)));
return errorsForField;
}
public static IHtmlString SimplePager<TModel>(this HtmlHelpers<TModel> htmlHelper, IPagedList pagedList, string baseUrl)
{
var pagerBuilder = new StringBuilder();
pagerBuilder.Append(@"<div class=""pager"">");
pagerBuilder.Append(@"<ul>");
pagerBuilder.AppendFormat(@"<li class=""previous {0}"">", !pagedList.HasPreviousPage ? "disabled" : "");
pagerBuilder.AppendFormat(@"<a href=""{0}"">&larr; Prev</a>", pagedList.HasPreviousPage ? String.Format("{0}page={1}", baseUrl, pagedList.PageNumber - 1) : "#");
pagerBuilder.Append(@"</li>");
pagerBuilder.AppendFormat(@"<li class=""next {0}"">", !pagedList.HasNextPage ? "disabled" : "");
pagerBuilder.AppendFormat(@"<a href=""{0}"">Next &rarr;</a>", pagedList.HasNextPage ? String.Format("{0}page={1}", baseUrl, pagedList.PageNumber + 1) : "#");
pagerBuilder.Append(@"</li>");
pagerBuilder.Append(@"</ul>");
pagerBuilder.Append(@"</div>");
return new NonEncodedHtmlString(pagerBuilder.ToString());
}
public static IHtmlString DisplayNoneIf<TModel>(this HtmlHelpers<TModel> htmlHelper, Expression<Func<TModel, bool>> expression)
{
if (expression.Compile()(htmlHelper.Model))
{
return new NonEncodedHtmlString(@" style=""display:none;"" ");
}
return NonEncodedHtmlString.Empty;
}
public static string RequestQuery<TModel>(this HtmlHelpers<TModel> htmlHelper)
{
if (htmlHelper.RenderContext.Context.Request.Url != null && !String.IsNullOrEmpty(htmlHelper.RenderContext.Context.Request.Url.Query))
{
return "?" + htmlHelper.RenderContext.Context.Request.Url.Query;
}
return String.Empty;
}
}
}
// Nancy Input Extensions
//Stolen from https://github.com/JabbR/JabbR/blob/dev/JabbR/Nancy/InputExtensions.cs
using System;
using System.Linq;
using Nancy.ViewEngines.Razor;
namespace JabbR
{
public static class InputExtensions
{
public static IHtmlString TextBox<TModel>(this HtmlHelpers<TModel> htmlHelper, string propertyName)
{
return TextBox(htmlHelper, propertyName, String.Empty);
}
public static IHtmlString TextBox<TModel>(this HtmlHelpers<TModel> htmlHelper, string propertyName, string className)
{
return TextBox(htmlHelper, propertyName, className, null);
}
public static IHtmlString TextBox<TModel>(this HtmlHelpers<TModel> htmlHelper, string propertyName, string className, string placeholder)
{
return InputHelper(htmlHelper, "text", propertyName, htmlHelper.GetValueForProperty(propertyName), className, placeholder);
}
public static IHtmlString Password<TModel>(this HtmlHelpers<TModel> htmlHelper, string propertyName)
{
return Password(htmlHelper, propertyName, String.Empty);
}
public static IHtmlString Password<TModel>(this HtmlHelpers<TModel> htmlHelper, string propertyName, string className)
{
return Password(htmlHelper, propertyName, className, null);
}
public static IHtmlString Password<TModel>(this HtmlHelpers<TModel> htmlHelper, string propertyName, string className, string placeholder)
{
return InputHelper(htmlHelper, "password", propertyName, null, className, placeholder);
}
private const string InputTemplate = @"<input type=""{0}"" id=""{1}"" name=""{2}"" value=""{3}"" class=""{4}"" placeholder=""{5}"" />";
private static IHtmlString InputHelper<TModel>(HtmlHelpers<TModel> htmlHelper, string inputType, string propertyName, string value, string className, string placeholder)
{
bool hasError = htmlHelper.GetErrorsForProperty(propertyName).Any();
return new NonEncodedHtmlString(String.Format(InputTemplate, inputType, propertyName, propertyName, value, hasError ? String.Format("{0} {1}", className, "error").Trim() : className, placeholder));
}
internal static string GetValueForProperty<TModel>(this HtmlHelpers<TModel> htmlHelper, string propertyName)
{
var propInfo =
typeof (TModel).GetProperties()
.FirstOrDefault(
x => x.Name.Equals(propertyName, StringComparison.InvariantCultureIgnoreCase));
string value = null;
if (propInfo != null && htmlHelper.Model != null)
{
value = propInfo.GetValue(htmlHelper.Model) as string;
}
if (String.IsNullOrWhiteSpace(value))
{
value = htmlHelper.RenderContext.Context.Request.Form[propertyName];
}
if (String.IsNullOrWhiteSpace(value))
{
value = htmlHelper.RenderContext.Context.Request.Query[propertyName];
}
return value;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment