私は ASP.Net MVC 3 を使用しており、すべての適切な DLL を参照していますが (含まれているスクリーンショットを参照)、何らかの理由でこのコンパイル エラーが発生します。
5 に答える
これは奇妙な出来事でした。エラーを再現できました。また、なぜそれが起こっているのか、それを回避する方法を理解することもできました.
発生する理由
と の間に名前空間の衝突がありSystem.Web.Mvc.Html
ますSystem.Web.WebPages.Html
衝突の結果はどうでしたか
System.Web.Mvc.Html
この名前空間はメソッドの定義を保持します
LabelExtensions.Label (HtmlHelper, String, String)
お気づきのとおり、これは優先順位が高く、問題を引き起こす名前空間です。オーバーロードは 2 つだけです。(String)
または(String, String)
。テスト中に、これが表示された唯一のオプションでした。
バイパスする方法
あなたが本当に欲しかったのは、この名前空間でした
System.Web.WebPages.Html
この名前空間はメソッドの定義を保持します
HtmlHelper.Label (String, String, IDictionary<String, Object>)
追加する可用性が存在することがわかりますnew { @class = "myClass" }
。
独自のインスタンスを作成する
独自のものを入手して、次のようHtmlHelper
にバイパスします。LabelExtension
かみそり
@{
var h = new System.Web.WebPages.Html.HtmlHelper();
}
asp
<% var h = new System.Web.WebPages.Html.HtmlHelper(); %>
これがカミソリまたは<%=
ブロック内にネストされていないことを確認してください。使用できなくなるためです。ページのグローバル レベルである必要があります。
正しいラベルを使用する
今、あなたはこれを使うことができます:
かみそり
@h.Label("firstName", "First Name", new { @class = "control-label" })
asp
<%= h.Label("firstName", "First Name", new { @class = "control-label" }) %>
Asp.Net Mvc 4からオーバーロードを選択したように見えますが、 Asp.Net Mvc 3に存在しないため、コンパイラが文句を言います。
次のリンクをチェックしてHtml.Label(...)
、Asp.Net Mvc のさまざまなバージョンでのオーバーロードを確認してください。
Asp.Net Mvc 2
Asp.Net Mvc 3
Asp.Net Mvc 4
リンクされたページの情報に基づくと、(何らかの理由で) Visual Studio がAsp.Net Mvc 4に基づいて Intellisense を提供しているように見えますが、ページがコンパイルされるはずの場合、Mvc バージョン 3 が使用され、オーバーロードが使用されます。選択したものは存在しません。
ただし、VSがバージョン4からIntellisenseを提供している理由はわかりません...
HtmlExtension
デフォルトでASP.NETMVC3に存在しないを使用しようとしているため、この例外が発生します。HTML属性のサポートをに追加する必要がありますHtml.Label()
。
基本的に、の独自の拡張メソッドを追加する必要がありますHtmlHelper
。MVC3ソースコードから始めることができます。このクラスを追加します。
public static class MyLabelExtensions
{
public static MvcHtmlString Label(this HtmlHelper html, string expression,
string labelText, object htmlAttributes)
{
return Label(html, expression, labelText,
new RouteValueDictionary(htmlAttributes));
}
public static MvcHtmlString Label(this HtmlHelper html, string expression,
string labelText, IDictionary<string, object> htmlAttributes)
{
return LabelHelper(html,
ModelMetadata.FromStringExpression(expression, html.ViewData),
expression, labelText, htmlAttributes);
}
// added htmlAttributes to the default MVC implementation
internal static MvcHtmlString LabelHelper(HtmlHelper html,
ModelMetadata metadata, string htmlFieldName,
string labelText = null,
IDictionary<string, object> htmlAttributes = null)
{
string str = labelText;
if (str == null)
{
string displayName = metadata.DisplayName;
if (displayName == null)
{
string propertyName = metadata.PropertyName;
if (propertyName == null)
str = Enumerable.Last(
htmlFieldName.Split(
new[]
{
'.'
}));
else
str = propertyName;
}
else
str = displayName;
}
string innerText = str;
if (string.IsNullOrEmpty(innerText))
return MvcHtmlString.Empty;
TagBuilder tagBuilder = new TagBuilder("label");
tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(
html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(
htmlFieldName)));
// this differs from MVC3 source code:
tagBuilder.MergeAttributes(htmlAttributes);
tagBuilder.SetInnerText(innerText);
// this is different too:
return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
}
}
これらの拡張メソッドを追加した後、次のようにビューで使用できます。
<%= Html.Label("firstName", "First Name", new { @class = "control-label" }) %>
あなたの~/Views/Web.config
configuration/system.web/pages/namespaces
ノードがあるかどうかを確認する
そこに追加<add namespace="System.Web.Mvc.Html"/>
してみてください。
Label メソッドは上記の名前空間にあります。ビューが見つからないようです。
ビューをコンパイルしないので、問題なくビルドできます。また、インテリセンスは参照からメソッドをうまく取得しています。ただし、ビューが実行時にメソッドを取得していない場合とほとんど同じです。
前述の名前空間を web.config に追加すると問題が解決する場合がありますが、アプリケーションでより大きな問題が発生する可能性があります。「修正」は、状況をさらにデバッグするための出発点を提供する必要があります。
これで問題が解決した場合は、web.config ファイルをまったく新しい手つかずの MVC プロジェクトと比較してみてください。ビューが Html ヘルパーを見つけられない可能性がある別の方法で取得したものを確認してください。
使用する代わりに
<%=Html.Label("firstname","First Name",new {@class="control-label"})%>
以下を使用してみてください:
カミソリで:
@Html.Label( "firstname", "First Name" ,new { @class = "control-label" });
ただし、個人的には、これを行わないことをお勧めします。モデルがあり、そこから名前を取得している場合は、次のように使用できます。
@Html.Label( model=>model.FirstName, "First Name" ,new { @class = "control-label" });
ASPX ビュー エンジンの場合:
<%=Html.Label(model=>model.FirstName,"First Name",new {@class="control-label"})%>
以下のように、ビューページに現在のモデルを必ず追加してください。
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Project.Models.Whatever>" %>