コード例 #1
0
        public static StandardRoute MapStandardRoute(this RouteCollection routeCollection, string routeName, string url, object defaults, object constraints, string[] routeNamespaces)
        {
            if (routeCollection == null)
            {
                throw new ArgumentNullException("routeCollection");
            }

            var standardRoute = new StandardRoute(url, new MvcRouteHandler())
            {
                Defaults    = RouteValueDictionaryExtensions.Convert(defaults),
                Constraints = RouteValueDictionaryExtensions.Convert(constraints),
                DataTokens  = new RouteValueDictionary()
            };

            foreach (var @default in standardRoute.Defaults.ToList())
            {
                if (@default.Value.ToString().Contains("*"))
                {
                    standardRoute.Defaults.Remove(@default.Key);
                    standardRoute.Defaults.Add(@default.Key, @default.Value.ToString().ReplaceAll("*", ""));
                }
            }

            if (routeNamespaces != null && routeNamespaces.Length > 0)
            {
                standardRoute.DataTokens["Namespaces"] = routeNamespaces;
            }

            routeCollection.Add(routeName, standardRoute);

            return(standardRoute);
        }
コード例 #2
0
        private MvcHtmlString LabelFor <TValue>(Expression <Func <TModel, TValue> > expression, object htmlAttributes = null, string expressionTypeName = null)
        {
            var modelMetadata  = ModelMetadata.FromLambdaExpression(expression, _htmlHelper.ViewData);
            var expressionText = GetExpressionText(expression);
            var labelText      = LabelText(modelMetadata, expressionText);

            if (string.IsNullOrEmpty(labelText))
            {
                return(MvcHtmlString.Empty);
            }

            if (string.IsNullOrEmpty(expressionTypeName))
            {
                expressionTypeName = GetExpressionTypeName(expression);
            }

            var templateInfo = _htmlHelper.ViewContext.ViewData.TemplateInfo;

            if (!string.IsNullOrEmpty(expressionTypeName))
            {
                templateInfo.HtmlFieldPrefix = expressionTypeName;
            }

            var @for = templateInfo.GetFullHtmlFieldId(expressionText);

            var labelTag = new TagBuilder("label");

            labelTag.MergeAttributes(RouteValueDictionaryExtensions.Convert(htmlAttributes));
            labelTag.Attributes.Add("for", Sanitizer.Slug(@for));
            labelTag.SetInnerText(labelText);

            return(MvcHtmlString.Create(labelTag.ToString(TagRenderMode.Normal)));
        }
コード例 #3
0
        public void ConvertToRouteValueDictionary_WithNull_ReturnsNull()
        {
            // Arrange, Act
            var dictionary = RouteValueDictionaryExtensions.ConvertToRouteValueDictionary(null);

            // Assert
            PAssert.IsTrue(() => dictionary == null);
        }
コード例 #4
0
        public static MvcHtmlString LocalizedRouteLinkWithId(this HtmlHelper htmlHelper, string key, object[] args, string routeName, long id, object routeValues = null, object htmlAttributes = null, string surroundUsing = "li", object surrounderAttributes = null, bool detectAndMarkAsActive = true, MvcHtmlString innerHtml = null)
        {
            var routeValueDictionary = RouteValueDictionaryExtensions.Convert(routeValues);

            routeValueDictionary.Add(KnownParameterNames.Id, id);

            return(htmlHelper.BuildRouteLink(htmlHelper.T(key, args), routeName, routeValueDictionary, htmlAttributes, surroundUsing, surrounderAttributes, detectAndMarkAsActive, innerHtml: innerHtml));
        }
コード例 #5
0
        public static string RouteUrlWithId(this UrlHelper urlHelper, string routeName, long id, object routeValues)
        {
            var routeValueDictionary = RouteValueDictionaryExtensions.Convert(routeValues);

            routeValueDictionary.Add(KnownParameterNames.Id, id);

            return(urlHelper.RouteUrl(routeName, routeValueDictionary));
        }
コード例 #6
0
        public static MvcHtmlString SignOutLink(this HtmlHelper htmlHelper, object routeValues = null, object htmlAttributes = null, string surroundUsing = "li", object surrounderAttributes = null, bool detectAndMarkAsActive = true, MvcHtmlString innerHtml = null)
        {
            var routeValuesDictionary = RouteValueDictionaryExtensions.Convert(routeValues);

            routeValuesDictionary.Add("then", htmlHelper.ViewContext.RequestContext.HttpContext.Request.Url.PathAndQuery);

            return(htmlHelper.LocalizedRouteLink(AuthenticateSectionConstants.SignController.Out.Commands.SignOut, AuthenticateSectionConstants.SignController.Out.RouteName, routeValuesDictionary, htmlAttributes, surroundUsing, surrounderAttributes, detectAndMarkAsActive, innerHtml));
        }
コード例 #7
0
        public static string ListRouteUrl(this UrlHelper urlHelper, string routeName, int page, object routeValues = null)
        {
            var routeValueDictionary = RouteValueDictionaryExtensions.Convert(routeValues);

            routeValueDictionary.Add(KnownParameterNames.Page, page);

            return(urlHelper.RouteUrl(routeName, routeValueDictionary));
        }
コード例 #8
0
        public static MvcHtmlString Pager <T>(this HtmlHelper htmlHelper, PagedList <T> pagedList, PagerOptions pagerOptions, string routeName, object routeValues, object htmlAttributes)
        {
            if (pagedList == null)
            {
                return(Pager(htmlHelper, pagerOptions, RouteValueDictionaryExtensions.Convert(htmlAttributes)));
            }

            return(Pager(htmlHelper, pagedList.TotalPageCount, pagedList.CurrentPageIndex, pagedList.PageSize, pagedList.TotalItemCount, null, null, pagerOptions, routeName, routeValues, htmlAttributes));
        }
コード例 #9
0
        public void ConvertToRouteValueDictionary_WithObjectDictionary_ReturnsPopulatedDictionary()
        {
            // Arrange
            var routeValues = new { foo = "bar" };

            // Act
            var dictionary = RouteValueDictionaryExtensions.ConvertToRouteValueDictionary(routeValues);

            // Assert
            PAssert.IsTrue(() => (string)dictionary["foo"] == "bar");
        }
コード例 #10
0
        public void ConvertToRouteValueDictionary_WithObjectThatIsDictionary_JustReturnsObjectCastToDictionary()
        {
            // Arrange
            object routeValues = new RouteValueDictionary();

            // Act
            var dictionary = RouteValueDictionaryExtensions.ConvertToRouteValueDictionary(routeValues);

            // Assert
            PAssert.IsTrue(() => routeValues == dictionary);
        }
コード例 #11
0
        private MvcHtmlString CheckBoxHelper(ModelMetadata modelMetadata, string name, bool?isChecked, object htmlAttributes, string expressionTypeName = null)
        {
            var attributes = RouteValueDictionaryExtensions.Convert(htmlAttributes);

            var explicitValue = isChecked.HasValue;

            if (explicitValue)
            {
                attributes.Remove("checked");
            }

            return(InputHelper(InputType.CheckBox, modelMetadata, name, "true", !explicitValue, isChecked ?? false, true, false, htmlAttributes, expressionTypeName));
        }
コード例 #12
0
        private static MvcHtmlString BuildRouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, object routeValues = null, object htmlAttributes = null, string surroundUsing = "li", object surrounderAttributes = null, bool detectAndMarkAsActive = true, string activeClassName = "active", MvcHtmlString innerHtml = null)
        {
            var isCurrentRequest = false;

            if (detectAndMarkAsActive)
            {
                isCurrentRequest = IsCurrentRequest(new UrlHelper(htmlHelper.ViewContext.RequestContext), routeName);
            }

            var htmlAttributesDictionary = RouteValueDictionaryExtensions.Convert(htmlAttributes);

            if (isCurrentRequest && string.IsNullOrEmpty(surroundUsing))
            {
                if (htmlAttributesDictionary.ContainsKey("class"))
                {
                    htmlAttributesDictionary["class"] += string.Concat(" ", activeClassName);
                }
                else
                {
                    htmlAttributesDictionary.Add("class", activeClassName);
                }
            }

            var link = htmlHelper.RouteLink(linkText, routeName, RouteValueDictionaryExtensions.Convert(routeValues), htmlAttributesDictionary);

            if (string.IsNullOrEmpty(surroundUsing))
            {
                return(link);
            }

            var tag = new TagBuilder(surroundUsing);

            tag.MergeAttributes(RouteValueDictionaryExtensions.Convert(surrounderAttributes));

            if (isCurrentRequest)
            {
                tag.AppendAttribute("class", activeClassName);
            }

            tag.InnerHtml = link.ToHtmlString();

            if (innerHtml != null)
            {
                tag.InnerHtml += innerHtml;
            }

            return(new MvcHtmlString(tag.ToString(TagRenderMode.Normal)));
        }
コード例 #13
0
        private MvcHtmlString TextAreaHelper(ModelMetadata modelMetadata, string name, IDictionary <string, object> rowsAndColumns, object htmlAttributes, string expressionTypeName = null)
        {
            var templateInfo = _htmlHelper.ViewContext.ViewData.TemplateInfo;

            if (!string.IsNullOrEmpty(expressionTypeName))
            {
                templateInfo.HtmlFieldPrefix = expressionTypeName;
            }

            var fullName = templateInfo.GetFullHtmlFieldName(name);

            var textAreaTag = new TagBuilder("textarea");

            textAreaTag.MergeAttribute("id", Sanitizer.Slug(fullName));
            textAreaTag.MergeAttributes(RouteValueDictionaryExtensions.Convert(htmlAttributes), true);
            textAreaTag.MergeAttributes(rowsAndColumns, rowsAndColumns != null);
            textAreaTag.MergeAttribute("name", fullName, true);

            ModelState modelState;

            _htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState);

            var unobtrusiveValidationAttributes = _htmlHelper.GetUnobtrusiveValidationAttributes(name);

            textAreaTag.MergeAttributes(unobtrusiveValidationAttributes);

            string value;

            if (modelState != null && modelState.Value != null)
            {
                value = modelState.Value.AttemptedValue;
            }
            else if (modelMetadata.Model != null)
            {
                value = modelMetadata.Model.ToString();
            }
            else
            {
                value = string.Empty;
            }

            textAreaTag.SetInnerText(value);

            return(textAreaTag.ToMvcHtmlString(TagRenderMode.Normal));
        }
コード例 #14
0
        private MvcHtmlString RadioButtonHelper(ModelMetadata modelMetadata, object model, string name, object value, bool?isChecked, object htmlAttributes, string expressionTypeName = null)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            var attributes = RouteValueDictionaryExtensions.Convert(htmlAttributes);

            var explicitValue = isChecked.HasValue;

            if (explicitValue)
            {
                attributes.Remove("checked");
            }
            else
            {
                var valueString = Convert.ToString(value, CultureInfo.CurrentCulture);
                isChecked = model != null && !string.IsNullOrEmpty(name) && string.Equals(model.ToString(), valueString, StringComparison.OrdinalIgnoreCase);
            }

            return(InputHelper(InputType.Radio, modelMetadata, name, value, false, isChecked ?? false, true, true, htmlAttributes, expressionTypeName));
        }
コード例 #15
0
        public MvcHtmlString TextAreaFor <TProperty>(Expression <Func <TModel, TProperty> > expression, int rows = 2, int columns = 20, object htmlAttributes = null, string expressionTypeName = null)
        {
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }

            var modelMetadata  = ModelMetadata.FromLambdaExpression(expression, _htmlHelper.ViewData);
            var expressionText = GetExpressionText(expression);

            if (string.IsNullOrEmpty(expressionTypeName))
            {
                expressionTypeName = GetExpressionTypeName(expression);
            }

            var placeholder = HintsText(modelMetadata);
            var attributes  = RouteValueDictionaryExtensions.Convert(htmlAttributes);

            attributes.Add("placeholder", placeholder);

            Func <MvcHtmlString> textAreaGenerator = () => TextAreaHelper(modelMetadata, expressionText, GetRowsAndColumnsDictionary(rows, columns), attributes, expressionTypeName);

            return(ControlHelper(expression, textAreaGenerator, expressionTypeName));
        }
コード例 #16
0
 public RouteHandleErrorAttribute(string routeName, object routeValues)
 {
     _routeName   = routeName;
     _routeValues = RouteValueDictionaryExtensions.Convert(routeValues);
 }
コード例 #17
0
        public static MvcHtmlString AjaxPager(this HtmlHelper htmlHelper, int totalPageCount, int pageIndex, int pageSize, int totalItemCount, string actionName, string controllerName, string routeName, PagerOptions pagerOptions, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes)
        {
            if (pagerOptions == null)
            {
                pagerOptions = new PagerOptions(htmlHelper);
            }

            var pagerBuilder = new PagerBuilder(htmlHelper, actionName, controllerName, totalPageCount, pageIndex, pageSize, totalItemCount, pagerOptions, routeName, RouteValueDictionaryExtensions.Convert(routeValues), ajaxOptions, RouteValueDictionaryExtensions.Convert(htmlAttributes));

            return(pagerBuilder.RenderPager());
        }
コード例 #18
0
        private MvcHtmlString SelectInternal(ModelMetadata modelMetadata, string optionLabel, string name, IEnumerable <SelectListItem> selectList, bool allowMultiple, object htmlAttributes, string expressionTypeName = null)
        {
            var templateInfo = _htmlHelper.ViewContext.ViewData.TemplateInfo;

            if (!string.IsNullOrEmpty(expressionTypeName))
            {
                templateInfo.HtmlFieldPrefix = expressionTypeName;
            }

            var fullName = templateInfo.GetFullHtmlFieldName(name);

            var usedViewData = false;

            if (selectList == null)
            {
                selectList   = GetSelectData(fullName);
                usedViewData = true;
            }

            var defaultValue = allowMultiple ? GetModelStateValue(fullName, typeof(string[])) : GetModelStateValue(fullName, typeof(string));

            if (!usedViewData)
            {
                if (defaultValue == null)
                {
                    defaultValue = _htmlHelper.ViewData.Eval(fullName);
                }
            }

            if (defaultValue != null)
            {
                var defaultValues = allowMultiple ? defaultValue as IEnumerable : new[] { defaultValue };
                var values        = from object value in defaultValues
                                    select Convert.ToString(value, CultureInfo.CurrentCulture);

                var selectedValues = new HashSet <string>(values, StringComparer.OrdinalIgnoreCase);
                var newSelectList  = new List <SelectListItem>();

                if (selectList != null)
                {
                    foreach (var selectListItem in selectList)
                    {
                        selectListItem.Selected = selectListItem.Value != null?selectedValues.Contains(selectListItem.Value) : selectedValues.Contains(selectListItem.Text);

                        newSelectList.Add(selectListItem);
                    }
                }

                selectList = newSelectList;
            }

            var listItemBuilder = new StringBuilder();

            if (optionLabel != null)
            {
                listItemBuilder.AppendLine(ListItemToOption(new SelectListItem {
                    Text     = optionLabel,
                    Value    = string.Empty,
                    Selected = false
                }));
            }

            if (selectList != null)
            {
                foreach (var item in selectList)
                {
                    listItemBuilder.AppendLine(ListItemToOption(item));
                }
            }

            var tagBuilder = new TagBuilder("select")
            {
                InnerHtml = listItemBuilder.ToString()
            };

            tagBuilder.MergeAttributes(RouteValueDictionaryExtensions.Convert(htmlAttributes));
            tagBuilder.MergeAttribute("name", fullName, true);
            tagBuilder.MergeAttribute("id", Sanitizer.Slug(fullName));
            if (allowMultiple)
            {
                tagBuilder.MergeAttribute("multiple", "multiple");
            }

            ModelState modelState;

            _htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState);

            var unobtrusiveValidationAttributes = _htmlHelper.GetUnobtrusiveValidationAttributes(name, modelMetadata);

            tagBuilder.MergeAttributes(unobtrusiveValidationAttributes);

            return(tagBuilder.ToMvcHtmlString(TagRenderMode.Normal));
        }
コード例 #19
0
        public MvcHtmlString ValidationSummary(bool excludePropertyErrors, string message, object htmlAttributes)
        {
            var formContext = _htmlHelper.ViewContext.FormContext;

            if (_htmlHelper.ViewData.ModelState.IsValid)
            {
                if (formContext == null)
                {
                    return(null);
                }

                if (_htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled && excludePropertyErrors)
                {
                    return(null);
                }
            }

            const string closeButton = "<a class=\"close\" href=\"#\">×</a>";

            string messageP;

            if (!string.IsNullOrEmpty(message))
            {
                var pTag = new TagBuilder("p");
                pTag.SetInnerText(message);
                messageP = pTag.ToString(TagRenderMode.Normal);
            }
            else
            {
                messageP = null;
            }

            var htmlSummary   = new StringBuilder();
            var unorderedList = new TagBuilder("ul");

            IEnumerable <ModelState> modelStates = null;

            if (excludePropertyErrors)
            {
                ModelState modelState;
                _htmlHelper.ViewData.ModelState.TryGetValue(_htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, out modelState);
                if (modelState != null)
                {
                    modelStates = new[] { modelState }
                }
                ;
            }
            else
            {
                modelStates = _htmlHelper.ViewData.ModelState.Values;
            }

            if (modelStates != null)
            {
                foreach (var modelState in modelStates)
                {
                    foreach (var modelError in modelState.Errors)
                    {
                        var errorText = GetUserErrorMessageOrDefault(_htmlHelper.ViewContext.HttpContext, modelError, null);
                        if (!string.IsNullOrEmpty(errorText))
                        {
                            var liTag = new TagBuilder("li");
                            liTag.SetInnerText(errorText);
                            htmlSummary.AppendLine(liTag.ToString(TagRenderMode.Normal));
                        }
                    }
                }
            }
            else if (string.IsNullOrEmpty(messageP))
            {
                return(null);
            }

            unorderedList.InnerHtml = htmlSummary.ToString();

            var divBuilder = new TagBuilder("div");

            divBuilder.MergeAttributes(RouteValueDictionaryExtensions.Convert(htmlAttributes));
            divBuilder.AddCssClass("alert-message block-message");
            divBuilder.AddCssClass(_htmlHelper.ViewData.ModelState.IsValid ? "success" : "error");
            divBuilder.InnerHtml = string.Concat(closeButton, messageP, unorderedList.ToString(TagRenderMode.Normal));

            if (formContext != null)
            {
                if (_htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled)
                {
                    if (!excludePropertyErrors)
                    {
                        divBuilder.MergeAttribute("data-valmsg-summary", "true");
                    }
                }
                else
                {
                    divBuilder.GenerateId("validationSummary");
                    formContext.ValidationSummaryId      = divBuilder.Attributes["id"];
                    formContext.ReplaceValidationSummary = !excludePropertyErrors;
                }
            }
            return(divBuilder.ToMvcHtmlString(TagRenderMode.Normal));
        }
コード例 #20
0
        private MvcHtmlString InputHelper(InputType inputType, ModelMetadata modelMetadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, object htmlAttributes, string expressionTypeName = null)
        {
            var templateInfo = _htmlHelper.ViewContext.ViewData.TemplateInfo;

            if (!string.IsNullOrEmpty(expressionTypeName))
            {
                templateInfo.HtmlFieldPrefix = expressionTypeName;
            }

            var fullName = templateInfo.GetFullHtmlFieldName(name);

            var tagBuilder = new TagBuilder("input");

            tagBuilder.MergeAttributes(RouteValueDictionaryExtensions.Convert(htmlAttributes));
            tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType));
            tagBuilder.MergeAttribute("name", fullName, true);

            var valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture);
            var usedModelState = false;

            switch (inputType)
            {
            case InputType.CheckBox:
                var modelStateWasChecked = GetModelStateValue(fullName, typeof(bool)) as bool?;
                if (modelStateWasChecked.HasValue)
                {
                    isChecked      = modelStateWasChecked.Value;
                    usedModelState = true;
                }
                goto case InputType.Radio;

            case InputType.Radio:
                if (!usedModelState)
                {
                    var modelStateValue = GetModelStateValue(fullName, typeof(string)) as string;
                    if (modelStateValue != null)
                    {
                        isChecked      = string.Equals(modelStateValue, valueParameter, StringComparison.Ordinal);
                        usedModelState = true;
                    }
                }
                if (!usedModelState && useViewData)
                {
                    isChecked = EvalBoolean(fullName);
                }
                if (isChecked)
                {
                    tagBuilder.MergeAttribute("checked", "checked");
                }
                tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue);
                break;

            case InputType.Password:
                if (value != null)
                {
                    tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue);
                }
                break;

            default:
                var attemptedValue = (string)GetModelStateValue(fullName, typeof(string));
                tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? EvalString(fullName) : valueParameter), isExplicitValue);
                break;
            }

            if (setId)
            {
                tagBuilder.MergeAttribute("id", Sanitizer.Slug(fullName));
            }

            ModelState modelState;

            _htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState);

            var unobtrusiveValidationAttributes = _htmlHelper.GetUnobtrusiveValidationAttributes(name, modelMetadata);

            tagBuilder.MergeAttributes(unobtrusiveValidationAttributes);

            if (inputType == InputType.CheckBox)
            {
                var inputItemBuilder = new StringBuilder();
                inputItemBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing));

                var hiddenInput = new TagBuilder("input");
                hiddenInput.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden));
                hiddenInput.MergeAttribute("name", fullName);
                hiddenInput.MergeAttribute("value", "false");
                inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing));
                return(MvcHtmlString.Create(inputItemBuilder.ToString()));
            }

            return(tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing));
        }