4

私は ASP.Net MVC 3 を使用しており、すべての適切な DLL を参照していますが (含まれているスクリーンショットを参照)、何らかの理由でこのコンパイル エラーが発生します。

メソッド署名

Web.config アセンブリ

コンパイル エラー

4

5 に答える 5

7

これは奇妙な出来事でした。エラーを再現できました。また、なぜそれが起こっているのか、それを回避する方法を理解することもできました.

発生する理由

と の間に名前空間の衝突があり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" }) %>

于 2012-12-20T21:29:43.450 に答える
1

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を提供している理由はわかりません...

于 2012-12-19T10:19:20.037 に答える
0

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" }) %>
于 2012-12-19T20:37:25.067 に答える
0

あなたの~/Views/Web.config

configuration/system.web/pages/namespacesノードがあるかどうかを確認する

そこに追加<add namespace="System.Web.Mvc.Html"/>してみてください。

Label メソッドは上記の名前空間にあります。ビューが見つからないようです。

ビューをコンパイルしないので、問題なくビルドできます。また、インテリセンスは参照からメソッドをうまく取得しています。ただし、ビューが実行時にメソッドを取得していない場合とほとんど同じです。

前述の名前空間を web.config に追加すると問題が解決する場合がありますが、アプリケーションでより大きな問題が発生する可能性があります。「修正」は、状況をさらにデバッグするための出発点を提供する必要があります。

これで問題が解決した場合は、web.config ファイルをまったく新しい手つかずの MVC プロジェクトと比較してみてください。ビューが Html ヘルパーを見つけられない可能性がある別の方法で取得したものを確認してください。

于 2012-12-18T18:19:43.593 に答える
-1

使用する代わりに

 <%=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>" %>
于 2012-12-14T17:13:33.170 に答える