PageRenderTime 28ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/mcs/class/System.Web.Mvc/System.Web.Mvc/HtmlHelper.cs

http://github.com/mono/mono
C# | 280 lines | 227 code | 42 blank | 11 comment | 28 complexity | c99d9abb7d10de53994c6b2cfc516335 MD5 | raw file
Possible License(s): GPL-2.0, CC-BY-SA-3.0, LGPL-2.0, MPL-2.0-no-copyleft-exception, LGPL-2.1, Unlicense, Apache-2.0
  1. /* ****************************************************************************
  2. *
  3. * Copyright (c) Microsoft Corporation. All rights reserved.
  4. *
  5. * This software is subject to the Microsoft Public License (Ms-PL).
  6. * A copy of the license can be found in the license.htm file included
  7. * in this distribution.
  8. *
  9. * You must not remove this notice, or any other, from this software.
  10. *
  11. * ***************************************************************************/
  12. namespace System.Web.Mvc {
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Diagnostics.CodeAnalysis;
  16. using System.Globalization;
  17. using System.Text;
  18. using System.Web;
  19. using System.Web.Mvc.Resources;
  20. using System.Web.Routing;
  21. [SuppressMessage("Microsoft.Security", "CA2112:SecuredTypesShouldNotExposeFields",
  22. Justification = "Public fields for CSS names do not contain secure information.")]
  23. public class HtmlHelper {
  24. private static string _idAttributeDotReplacement;
  25. public static readonly string ValidationInputCssClassName = "input-validation-error";
  26. public static readonly string ValidationMessageCssClassName = "field-validation-error";
  27. public static readonly string ValidationSummaryCssClassName = "validation-summary-errors";
  28. private AntiForgeryDataSerializer _serializer;
  29. public HtmlHelper(ViewContext viewContext, IViewDataContainer viewDataContainer)
  30. : this(viewContext, viewDataContainer, RouteTable.Routes) {
  31. }
  32. public HtmlHelper(ViewContext viewContext, IViewDataContainer viewDataContainer, RouteCollection routeCollection) {
  33. if (viewContext == null) {
  34. throw new ArgumentNullException("viewContext");
  35. }
  36. if (viewDataContainer == null) {
  37. throw new ArgumentNullException("viewDataContainer");
  38. }
  39. if (routeCollection == null) {
  40. throw new ArgumentNullException("routeCollection");
  41. }
  42. ViewContext = viewContext;
  43. ViewDataContainer = viewDataContainer;
  44. RouteCollection = routeCollection;
  45. }
  46. public static string IdAttributeDotReplacement {
  47. get {
  48. if (String.IsNullOrEmpty(_idAttributeDotReplacement)) {
  49. _idAttributeDotReplacement = "_";
  50. }
  51. return _idAttributeDotReplacement;
  52. }
  53. set {
  54. _idAttributeDotReplacement = value;
  55. }
  56. }
  57. public RouteCollection RouteCollection {
  58. get;
  59. private set;
  60. }
  61. internal AntiForgeryDataSerializer Serializer {
  62. get {
  63. if (_serializer == null) {
  64. _serializer = new AntiForgeryDataSerializer();
  65. }
  66. return _serializer;
  67. }
  68. set {
  69. _serializer = value;
  70. }
  71. }
  72. public ViewContext ViewContext {
  73. get;
  74. private set;
  75. }
  76. public ViewDataDictionary ViewData {
  77. get {
  78. return ViewDataContainer.ViewData;
  79. }
  80. }
  81. public IViewDataContainer ViewDataContainer {
  82. get;
  83. private set;
  84. }
  85. public string AntiForgeryToken() {
  86. return AntiForgeryToken(null /* salt */);
  87. }
  88. public string AntiForgeryToken(string salt) {
  89. return AntiForgeryToken(salt, null /* domain */, null /* path */);
  90. }
  91. public string AntiForgeryToken(string salt, string domain, string path) {
  92. string formValue = GetAntiForgeryTokenAndSetCookie(salt, domain, path);
  93. string fieldName = AntiForgeryData.GetAntiForgeryTokenName(null);
  94. TagBuilder builder = new TagBuilder("input");
  95. builder.Attributes["type"] = "hidden";
  96. builder.Attributes["name"] = fieldName;
  97. builder.Attributes["value"] = formValue;
  98. return builder.ToString(TagRenderMode.SelfClosing);
  99. }
  100. [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic",
  101. Justification = "For consistency, all helpers are instance methods.")]
  102. public string AttributeEncode(string value) {
  103. return (!String.IsNullOrEmpty(value)) ? HttpUtility.HtmlAttributeEncode(value) : String.Empty;
  104. }
  105. public string AttributeEncode(object value) {
  106. return AttributeEncode(Convert.ToString(value, CultureInfo.InvariantCulture));
  107. }
  108. [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic",
  109. Justification = "For consistency, all helpers are instance methods.")]
  110. public string Encode(string value) {
  111. return (!String.IsNullOrEmpty(value)) ? HttpUtility.HtmlEncode(value) : String.Empty;
  112. }
  113. public string Encode(object value) {
  114. return Encode(Convert.ToString(value, CultureInfo.CurrentCulture));
  115. }
  116. internal string EvalString(string key) {
  117. return Convert.ToString(ViewData.Eval(key), CultureInfo.CurrentCulture);
  118. }
  119. internal bool EvalBoolean(string key) {
  120. return Convert.ToBoolean(ViewData.Eval(key), CultureInfo.InvariantCulture);
  121. }
  122. internal static IView FindPartialView(ViewContext viewContext, string partialViewName, ViewEngineCollection viewEngineCollection) {
  123. ViewEngineResult result = viewEngineCollection.FindPartialView(viewContext, partialViewName);
  124. if (result.View != null) {
  125. return result.View;
  126. }
  127. StringBuilder locationsText = new StringBuilder();
  128. foreach (string location in result.SearchedLocations) {
  129. locationsText.AppendLine();
  130. locationsText.Append(location);
  131. }
  132. throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture,
  133. MvcResources.Common_PartialViewNotFound, partialViewName, locationsText));
  134. }
  135. public static string GenerateLink(RequestContext requestContext, RouteCollection routeCollection, string linkText, string routeName, string actionName, string controllerName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes) {
  136. return GenerateLink(requestContext, routeCollection, linkText, routeName, actionName, controllerName, null/* protocol */, null/* hostName */, null/* fragment */, routeValues, htmlAttributes);
  137. }
  138. public static string GenerateLink(RequestContext requestContext, RouteCollection routeCollection, string linkText, string routeName, string actionName, string controllerName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes) {
  139. return GenerateLinkInternal(requestContext, routeCollection, linkText, routeName, actionName, controllerName, protocol, hostName, fragment, routeValues, htmlAttributes, true /* includeImplicitMvcValues */);
  140. }
  141. private static string GenerateLinkInternal(RequestContext requestContext, RouteCollection routeCollection, string linkText, string routeName, string actionName, string controllerName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes, bool includeImplicitMvcValues) {
  142. string url = UrlHelper.GenerateUrl(routeName, actionName, controllerName, protocol, hostName, fragment, routeValues, routeCollection, requestContext, includeImplicitMvcValues);
  143. TagBuilder tagBuilder = new TagBuilder("a") {
  144. InnerHtml = (!String.IsNullOrEmpty(linkText)) ? HttpUtility.HtmlEncode(linkText) : String.Empty
  145. };
  146. tagBuilder.MergeAttributes(htmlAttributes);
  147. tagBuilder.MergeAttribute("href", url);
  148. return tagBuilder.ToString(TagRenderMode.Normal);
  149. }
  150. public static string GenerateRouteLink(RequestContext requestContext, RouteCollection routeCollection, string linkText, string routeName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes) {
  151. return GenerateRouteLink(requestContext, routeCollection, linkText, routeName, null/* protocol */, null/* hostName */, null/* fragment */, routeValues, htmlAttributes);
  152. }
  153. public static string GenerateRouteLink(RequestContext requestContext, RouteCollection routeCollection, string linkText, string routeName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes) {
  154. return GenerateLinkInternal(requestContext, routeCollection, linkText, routeName, null /* actionName */, null /* controllerName */, protocol, hostName, fragment, routeValues, htmlAttributes, false /* includeImplicitMvcValues */);
  155. }
  156. private string GetAntiForgeryTokenAndSetCookie(string salt, string domain, string path) {
  157. string cookieName = AntiForgeryData.GetAntiForgeryTokenName(ViewContext.HttpContext.Request.ApplicationPath);
  158. AntiForgeryData cookieToken;
  159. HttpCookie cookie = ViewContext.HttpContext.Request.Cookies[cookieName];
  160. if (cookie != null) {
  161. cookieToken = Serializer.Deserialize(cookie.Value);
  162. }
  163. else {
  164. cookieToken = AntiForgeryData.NewToken();
  165. string cookieValue = Serializer.Serialize(cookieToken);
  166. HttpCookie newCookie = new HttpCookie(cookieName, cookieValue) { HttpOnly = true, Domain = domain };
  167. if (!String.IsNullOrEmpty(path)) {
  168. newCookie.Path = path;
  169. }
  170. ViewContext.HttpContext.Response.Cookies.Set(newCookie);
  171. }
  172. AntiForgeryData formToken = new AntiForgeryData(cookieToken) {
  173. CreationDate = DateTime.Now,
  174. Salt = salt
  175. };
  176. string formValue = Serializer.Serialize(formToken);
  177. return formValue;
  178. }
  179. public static string GetFormMethodString(FormMethod method) {
  180. switch (method) {
  181. case FormMethod.Get:
  182. return "get";
  183. case FormMethod.Post:
  184. return "post";
  185. default:
  186. return "post";
  187. }
  188. }
  189. public static string GetInputTypeString(InputType inputType) {
  190. switch (inputType) {
  191. case InputType.CheckBox:
  192. return "checkbox";
  193. case InputType.Hidden:
  194. return "hidden";
  195. case InputType.Password:
  196. return "password";
  197. case InputType.Radio:
  198. return "radio";
  199. case InputType.Text:
  200. return "text";
  201. default:
  202. return "text";
  203. }
  204. }
  205. internal object GetModelStateValue(string key, Type destinationType) {
  206. ModelState modelState;
  207. if (ViewData.ModelState.TryGetValue(key, out modelState)) {
  208. return modelState.Value.ConvertTo(destinationType, null /* culture */);
  209. }
  210. return null;
  211. }
  212. internal virtual void RenderPartialInternal(string partialViewName, ViewDataDictionary viewData, object model, ViewEngineCollection viewEngineCollection) {
  213. if (String.IsNullOrEmpty(partialViewName)) {
  214. throw new ArgumentException(MvcResources.Common_NullOrEmpty, "partialViewName");
  215. }
  216. ViewDataDictionary newViewData = null;
  217. if (model == null) {
  218. if (viewData == null) {
  219. newViewData = new ViewDataDictionary(ViewData);
  220. }
  221. else {
  222. newViewData = new ViewDataDictionary(viewData);
  223. }
  224. }
  225. else {
  226. if (viewData == null) {
  227. newViewData = new ViewDataDictionary(model);
  228. }
  229. else {
  230. newViewData = new ViewDataDictionary(viewData) { Model = model };
  231. }
  232. }
  233. ViewContext newViewContext = new ViewContext(ViewContext, ViewContext.View, newViewData, ViewContext.TempData);
  234. IView view = FindPartialView(newViewContext, partialViewName, viewEngineCollection);
  235. view.Render(newViewContext, ViewContext.HttpContext.Response.Output);
  236. }
  237. }
  238. }