6

App_Codeディレクトリの下のファイルにヘルパーメソッドがあります。この方法はMVC3で完全に機能しますが、MVC4にアップグレードした後は機能しません。最初の@if()ブロックで失敗しています...

[編集]これは、Razorエンジンの解析エラーのようです。すべてのオブジェクトとそのプロパティがnullでない場合、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。私は直接マイクロソフトに行かなければならないと思います。

[編集]エラーメッセージは、古い「オブジェクト参照がオブジェクトのインスタンスに設定されていません」です。条件内の各オブジェクトとプロパティは有効であり、nullではないため、これは奇妙です。

@helper RenderConnectButton(System.Web.Mvc.HtmlHelper helper, ContactTwitterHandleDto contactTwitterHandle, ContactFacebookAccountDto contactFacebookAccount) {
    <ul class="socialMedia inlineList">           
        @if (contactTwitterHandle != null && contactTwitterHandle.IsValid.HasValue && contactTwitterHandle.IsValid.Value)
        {
            var tHandle = "@" + contactTwitterHandle.Handle;
            <li class="twitter">
                <a class="btn" href="http://www.twitter.com/@contactTwitterHandle.Handle" target="_blank">
                    <i></i>
                    <span class="label">@tHandle</span> 
                </a>
                @if(contactTwitterHandle.FollowerCount.HasValue)
                {
                    <div class="count" id="c">
                        <i></i>
                        <u></u>
                        <span class="followers" title="@contactTwitterHandle.FollowerCount.Value followers">@FollowerCount(contactTwitterHandle.FollowerCount.Value)</span>
                    </div>
                }                    
            </li>
            <script type="text/javascript">
                $("#twitter").click(function () {
                    window.location.href = '@(helper.BuildUrlFromExpression<TenantController>(t => t.LinkTwitterAccount()))';
                })
            </script>
        }

        @if (contactFacebookAccount != null && contactFacebookAccount.IsValid.HasValue && contactFacebookAccount.IsValid.Value)
        {
            <li class="facebook">
                <a class="btn" href="@contactFacebookAccount.Url" target="_blank">
                    <i></i>
                    <span class="label">@contactFacebookAccount.Name</span> 
                </a>
                @if(contactFacebookAccount.FriendCount.HasValue)
                {
                    <div class="count" id="c">
                        <i></i>
                        <u></u>
                        <span class="followers" title="@contactFacebookAccount.FriendCount.Value friends">@FriendCount(contactFacebookAccount.FriendCount.Value)</span>
                    </div>
                }
            </li>                
        }
    </ul> }

[更新]コードを少し変更しましたが、今ではさらに奇妙になっています。上記と同じエラーが次の行に表示されます。

var tLink = "http://www.twitter.com/" + contactTwitterHandle.Handle; 

contactTwitterHandleとcontactTwitterHandle.Handleはどちらもnullではありません。

@helper RenderConnectButton(System.Web.Mvc.HtmlHelper helper, ContactTwitterHandleDto contactTwitterHandle, ContactFacebookAccountDto contactFacebookAccount) {
    <ul class="socialMedia inlineList">           
        @if (contactTwitterHandle != null && contactTwitterHandle.IsValid.HasValue && contactTwitterHandle.IsValid.Value)
        {
            var tHandle = "@" + contactTwitterHandle.Handle;
            var tLink = "http://www.twitter.com/" + contactTwitterHandle.Handle;
            <li class="twitter">
                <a class="btn" href="@tLink" target="_blank">
                    <i></i>
                    <span class="label">@tHandle</span> 
                </a>
                @if(contactTwitterHandle.FollowerCount.HasValue)
                {
                    <div class="count" id="c">
                        <i></i>
                        <u></u>
                        <span class="followers" title="@contactTwitterHandle.FollowerCount.Value followers">@FollowerCount(contactTwitterHandle.FollowerCount.Value)</span>
                    </div>
                }                    
            </li>
            <script type="text/javascript">
                $("#twitter").click(function () {
                    window.location.href = '@(helper.BuildUrlFromExpression<TenantController>(t => t.LinkTwitterAccount()))';
                })
            </script>
        }

        @if (contactFacebookAccount != null && contactFacebookAccount.IsValid.HasValue && contactFacebookAccount.IsValid.Value)
        {
            <li class="facebook">
                <a class="btn" href="@contactFacebookAccount.Url" target="_blank">
                    <i></i>
                    <span class="label">@contactFacebookAccount.Name</span> 
                </a>
                @if(contactFacebookAccount.FriendCount.HasValue)
                {
                    <div class="count" id="c">
                        <i></i>
                        <u></u>
                        <span class="followers" title="@contactFacebookAccount.FriendCount.Value friends">@FriendCount(contactFacebookAccount.FriendCount.Value)</span>
                    </div>
                }
            </li>                
        }
    </ul>
}
4

2 に答える 2

2

この問題の回避策を見つけましたが、最初は少し歴史があります。この特定のMVCプロジェクトでは、Razorの実装を徐々に開始することにしました。アプリには多くの「モーダル」領域があり、部分的なビューを取得するためにAJAX呼び出しを行うことで埋められます。これらの部分的なビューは、Razorビューとして最初に実装されました。後で、Razor部分ビューを使用して標準のASPXビューページに新しい機能を実装したかったのですが、ASPXビューエンジンは部分Razorビューをレンダリングできないため、Razorビューを使用する代わりに、App_CodeフォルダーにMVCヘルパーファイルを追加しました。フィーチャーをレンダリングするメソッド。この方法が、MVC4へのアップグレード後にエラーを引き起こしている原因です。この方法でレンダリングされた機能を備えたページが私です これで問題は修正されましたが、ヘルパーメソッドを使用してレンダリングするためのRazorエンジンのバグであると私は主張しています。

于 2012-05-17T15:17:00.217 に答える
0

私はこれにメソッドをダミーしました:

@helper RenderConnectButton(System.Web.Mvc.HtmlHelper helper, ContactTwitterHandleDto contactTwitterHandle, ContactFacebookAccountDto contactFacebookAccount) {

    <ul class="socialMedia inlineList">
        @if (contactTwitterHandle != null && contactTwitterHandle.IsValid.HasValue && contactTwitterHandle.IsValid.Value)
        {
            var tHandle = contactTwitterHandle.Handle;

            <li class="twitter">
                <a class="btn" href="http://twitter.com/@tHandle" target="_blank">
                    <i></i>
                    <span class="label">@tHandle</span> 
                </a>
            </li>
        }

    </ul>
}

行から@tHandleを削除すると、次のようになります。

            <a class="btn" href="http://twitter.com/@tHandle" target="_blank">

正常に解析されます。上記のURLを変数に入れると、エラーが発生します。

URLである文字列を解析しようとすると失敗します。

スタックトレース:

   at System.Web.WebPages.HelperPage.WriteAttributeTo(TextWriter writer, String name, PositionTagged`1 prefix, PositionTagged`1 suffix, AttributeValue[] values)
   at ASP.MvcSocialMediaHelpers.<>c__DisplayClass1.<RenderConnectButton>b__0(TextWriter __razor_helper_writer) in c:\OberonScrum\Branches\RazorUpgrade\Source\Web\App_Code\MvcSocialMediaHelpers.cshtml:line 83
   at System.Web.WebPages.HelperResult.ToString()
   at System.String.Concat(Object arg0, Object arg1)
   at ASP.views_contact_detail_aspx.__RenderMainContent(HtmlTextWriter __w, Control parameterContainer) in c:\OberonScrum\Branches\RazorUpgrade\Source\Web\Views\Contact\Detail.aspx:line 13
   at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   at ASP.views_shared_twocolumnleftmain_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\OberonScrum\Branches\RazorUpgrade\Source\Web\Views\Shared\TwoColumnLeftMain.Master:line 109
   at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   at System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

[更新]TagBuilderを使用して問題を回避し、Html.Raw()を使用してレンダリングしようとしました。同じ結果が得られました。

@helper RenderConnectButton(System.Web.Mvc.HtmlHelper helper, ContactTwitterHandleDto contactTwitterHandle, ContactFacebookAccountDto contactFacebookAccount) {
    <ul class="socialMedia inlineList">
        @if (contactTwitterHandle != null && contactTwitterHandle.IsValid.HasValue && contactTwitterHandle.IsValid.Value)
        {
            var tHandle = contactTwitterHandle.Handle;
            var a = new TagBuilder("a");
            a.Attributes.Add("href", "http://twitter.com/" + @tHandle);
            a.Attributes.Add("target", "_blank");
            a.Attributes.Add("class", "btn");
            a.InnerHtml = string.Format("<i></i><span class=\"label\">{0}</span>", @tHandle);

            <li class="twitter">
                @Html.Raw(a.ToString())
            </li>
        }
    </ul>
}
于 2012-05-16T18:37:23.790 に答える