私はasp.net mvc 5エディタテンプレートでしばらくChris PrattのMergeHtmlAttributes HTMLヘルパー拡張メソッドを使用してきました。私はAsp.netコア1.1(.netフレームワーク4.5.2)にアプリケーションを切り替えるプロセスを開始しました。そして、htmlhelperExtensionは私のために働いていません。asp.netコアのHtmlAttributesを
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;
}
}
私がクラスをコピーすると、statmentにフラグが立てられます。using System.Web.Mvc;シンボルMVCを解決できません。 そして、そのステートメントを使用して削除した後、メッセージが "HtmlHelper"というシンボルを解決できない場合は、 Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper
または.HtmlHelper<Tmodel>
のいずれかを追加するか、.HtmlHelper
を選択しました。 その後、RouteValueDictionaryのhtmlAttributes =行を参照し、IDictionary<string, object>
をsystem.web.Routing.RouteValueDictionary
に変換できないことを示します。タイプをIDictionary<string, object>
に変更するか、RouteValueDictionary
にキャストする必要があります。どちらの方法でも、エディタテンプレートの1つでMergeHtmlAttributesを使用しようとすると、次のエラーが発生します。
'IHtmlHelper<object>'
「をMergeHtmlAttributes」と最良拡張メソッドのオーバーロード「HtmlHelperExtensions.MergeHtmlAttributes(HtmlHelperの、オブジェクト、オブジェクト)」タイプの受信機を必要とする「のHtmlHelper」の定義が含まれていないこの行はエラーを投げています - >var htmlAttributes = Html.MergeHtmlAttributes(ViewData, defaultHtmlAttributesObject);
asp.netコアでこれを動作させる方法はありますか、同じ結果を得るための別の方法がありますか?次に、使用しているMergeHtmlAttributesが表示されるように、エディタテンプレートの例を示します。このようなテンプレートを作成できない場合は、タグヘルパーを使用して新しい/優れた方法がありますか?私はlabelfor、txtboxfor、ValidationMessageForなどをすべて1つの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コア1.1(および.netフレームワーク4.5.2)に変換中に、私は接続文字列をapp.configファイルに入れて、EF6をAsp.netコアで動作させることができたので、私が持っていたEFコードどのような理由であれ、appsettings.jsonに接続文字列が見つかりませんでした。
私は関数定義はされるべきだと思う: パブリック静的のIDictionary <文字列、オブジェクト> MergeHtmlAttributes(このIHtmlHelperヘルパー、htmlAttributesObjectオブジェクト、defaultHtmlAttributesObjectオブジェクト) 私はその後、私は、「シンボルAnonymousObjectToHtmlAttributesを解決できません」を取得することをやるたらIHtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributesObject); AnonymousObjectToHtmlAttributesがここでgithubに実装されていた方法を発見しました: https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/HtmlHelper.cs –