2012-05-16 11 views
6

私は、App_Codeディレクトリ下のファイルにヘルパーメソッドを持っています。このメソッドはMVC 3では完全に正常に動作しますが、MVC 4にアップグレードした後は正しく動作しません。最初の@if()ブロックで失敗しています...MVC 3から4へのアップグレード後にRazorヘルパーメソッドが機能しない

[編集]これはRazorエンジンの解析エラーのようです。すべてのオブジェクトとそのプロパティがnullでないときに 'オブジェクト参照がオブジェクトのインスタンスに設定されていません'というエラーが表示されます。私はMicrosoftに直接行く必要があると思う。

[編集]エラーメッセージは、古い「オブジェクト参照がオブジェクトのインスタンスに設定されていません」です。条件内の各オブジェクトとプロパティが有効で、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> } 

[UPDATE] 私は、コードを少し変更し、今それも見知らぬ人です。私はラインで上記と同じエラーを取得しています:

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

contactTwitterHandleとcontactTwitterHandle.Handleは両方ともNULLではありません。私はラインから@tHandleを削除した場合

@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> 
} 

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

それは罰金解析する

@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> 
} 
+0

おそらくエラーメッセージで「失敗」しますか?それは何ですか? –

+0

これは参考になるかもしれません。私は上記の質問にそれを入れます。 – Silkster

+0

さて、 'contactTwitterHandle'がnullである可能性が非常に高いようです。デバッガを起動し、それがなぜそうであるのかを調べます。 –

答えて

2

私はこの問題の回避策を見つけましたが、少し歴史がありました。このMVCプロジェクトでは、徐々にRazorの実装を開始することにしました。アプリは、部分的なビューを得るためにAJAX呼び出しを行うことでいっぱいになる "モーダル"領域をたくさん持っています。これらの部分的なビューは、初めてレイザービューとして実装されました。その後、Razorの部分ビューを使用して標準のASPXビューページに新しい機能を実装したいと考えましたが、Razorビューを使用する代わりにASPXビューエンジンで部分的なRazorビューをレンダリングできません.App_CodeフォルダにMVCヘルパーファイルを追加しました。その機能をレンダリングするメソッド。このメソッドは、MVC4にアップグレードした後でエラーを引き起こしています。この方法でレンダリングされた機能を備えたページは、私がRazorビューページに変換しているものなので、今日では、そのメソッドからRazorの部分ビューにコードを移動するだけでよいことに気付きました。 これで問題は解決しましたが、これは、ヘルパーメソッドでレンダリングするためのRazorエンジンのバグです。

0

は、私がこれまでの方法をダウンdummied。上記の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) 

[UPDATE] は)(Html.RawでTagBuilderを使用してレンダリングの問題を中心に取り組んでみました。同じ結果を得ました。

@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> 
} 
+0

興味深いことに、フレームワーククラス/メソッドである 'HelperPage.WriteAttributeTo'でエラーが発生しています。私はMVC4が空の値を持つ属性のための洗練されたサポートを追加することを知っています。おそらくここにバグがあります。 –

+0

それも私が考えていたものです。 – Silkster

+0

多分、1つの質問に投稿するのはたくさんの情報です。 – Silkster

関連する問題