Я некоторое время использовал метод MergeHtmlAttributes Html Helper Extension Криса Пратта в своих шаблонах редактора asp.net mvc 5. Я начал процесс переключения приложения на ядро Asp.net 1.1 (.net framework 4.5.2). И htmlhelperExtension у меня не работает.
public static partial class HtmlHelperExtensions
{
//https://cpratt.co/html-editorfor-and-htmlattributes/
public static IDictionary<string, object> MergeHtmlAttributes(this HtmlHelper helper, object htmlAttributesObject, object defaultHtmlAttributesObject)
{
var concatKeys = new string[] { "class" };
var htmlAttributesDict = htmlAttributesObject as IDictionary<string, object>;
var defaultHtmlAttributesDict = defaultHtmlAttributesObject as IDictionary<string, object>;
RouteValueDictionary htmlAttributes = (htmlAttributesDict != null)
? new RouteValueDictionary(htmlAttributesDict)
: HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributesObject);
RouteValueDictionary defaultHtmlAttributes = (defaultHtmlAttributesDict != null)
? new RouteValueDictionary(defaultHtmlAttributesDict)
: HtmlHelper.AnonymousObjectToHtmlAttributes(defaultHtmlAttributesObject);
foreach (var item in htmlAttributes)
{
if (concatKeys.Contains(item.Key))
{
defaultHtmlAttributes[item.Key] = (defaultHtmlAttributes[item.Key] != null)
? string.Format("{0} {1}", defaultHtmlAttributes[item.Key], item.Value)
: item.Value;
}
else
{
if(item.Key?.ToString() == "divClass")
{
continue;
}
defaultHtmlAttributes[item.Key] = item.Value;
}
}
return defaultHtmlAttributes;
}
}
Когда я копирую класс поверх него, он помечает статус: using System.Web.Mvc; -Не удается разрешить символ MVC. И после удаления этого оператора using я получаю сообщение, что не могу разрешить символ «HtmlHelper» в MergeHtmlAttributes(this HtmlHelper helper, ...)
. У меня есть возможность добавить либо Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper
, либо .HtmlHelper<Tmodel>
. Я выбрал .HtmlHelper
. После этого он ссылается на строку RouteValueDictionary htmlAttributes = и говорит, что не может преобразовать IDictionary<string, object>
в system.web.Routing.RouteValueDictionary
. И я должен изменить тип на IDictionary<string, object>
или привести к RouteValueDictionary
. В любом случае я получаю следующую ошибку при попытке использовать MergeHtmlAttributes в одном из моих шаблонов редактора.
'IHtmlHelper<object>'
не содержит определения для «MergeHtmlAttributes», а лучшая перегрузка метода расширения «HtmlHelperExtensions.MergeHtmlAttributes (HtmlHelper, объект, объект)» требует приемника типа «HtmlHelper»
Эта строка выдает ошибку-> var htmlAttributes = Html.MergeHtmlAttributes(ViewData, defaultHtmlAttributesObject);
Есть ли способ заставить это работать в ядре asp.net или есть другой метод для достижения тех же результатов? Вот пример одного из моих шаблонов редактора, чтобы вы могли видеть, как используются атрибуты MergeHtmlAttributes. Если я больше не могу создавать такой шаблон, есть ли более новый/лучший способ сделать это с помощью помощников по тегам? Мне очень нравится иметь labelfor, txtboxfor, ValidationMessageFor и т. д. все в одном помощнике html.
@model int?
@{
var defaultHtmlAttributesObject = new { @class = "form-control" };
var htmlAttributes = Html.MergeHtmlAttributes(ViewData, defaultHtmlAttributesObject);
object divClass;
ViewData.TryGetValue("divClass", out divClass);
if (divClass == null) { divClass = ""; }
IDictionary<string, object> validationAttributes = Html.GetUnobtrusiveValidationAttributes("");
Html.ViewContext.FormContext.RenderedField(ViewData.TemplateInfo.GetFullHtmlFieldName(null), false);
}
<div class="form-group @divClass @(Html.ValidationErrorFor(x => x, " has-error"))">
@Html.LabelFor(x => x, new { @class = "control-label" })
@if (validationAttributes.ContainsKey("data-val-required"))
{<span class="text-danger">*</span>}
@Html.TextBoxFor(x => x, htmlAttributes)
@Html.ValidationMessageFor(model => model, "", new { @class = "text-danger" })
</div>
F.Y.I. при преобразовании в asp.net core 1.1 (и .net framework 4.5.2) я в итоге поместил строку подключения в файл app.config, что позволило EF6 работать с ядром Asp.net, поэтому я могу продолжать использовать код EF, который у меня был построен, по какой-то причине он не нашел строку подключения в appsettings.json.