2012-05-16 12 views
6

App_Code dizini altındaki bir dosyada yardımcı yöntem var. Yöntem MVC 3'te gayet iyi çalışır, ancak MVC 4'e yükseltildikten sonra olmaz. İlk @if() bloğunda başarısız oluyor ...Razor yardımcı yöntemi MVC 3'ten yükseltmeye çalıştıktan sonra çalışmaz

[Düzenle] Bu, Razor motorunda ayrıştırma hatası gibi görünüyor. Tüm nesnelerim ve özellikleri NULLER DEĞİLSE 'Nesne başvurusu bir nesnenin örneğine ayarlanmadım' hatasını alıyorum. Sanırım doğrudan Microsoft'a gitmeliyim.

[Düzenle] Hata iletisi, 'Nesne başvurusu, bir nesnenin örneğine ayarlanmadı.' Bu garip çünkü koşuldaki her nesne VE özellik geçerli ve boş değil.

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

[GÜNCELLEME]

Ben kodu biraz değişti ve şimdi bile yabancı. Ben çizgisinde yukarıdaki ile aynı hatayı alıyorum:

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

contactTwitterHandle ve contactTwitterHandle.Handle hem boş DEĞİLDİR. Ben satırından @tHandle kaldırırsanız

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

Bu ince ayrıştırmak olacak

@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

Muhtemelen bir hata mesajıyla "başarısız" olur mu? Bu ne? –

+0

Bu yardımcı olabilir. Yukarıdaki soruya koyacağım. – Silkster

+0

Eh, o zaman 'contactTwitterHandle' null olduğunu görünüyor. Hata ayıklayıcınızı ateşleyin ve neden böyle olduğunu öğrenin. –

cevap

2

Bu sorunla ilgili çalışmayı buldum, ancak önce biraz geçmiş. Bu özel MVC projesi için, Razor'u aşamalı olarak uygulamaya başlamaya karar verdik. App kısmi bir görünüm elde etmek için AJAX çağrısı yaparak doldurulur "modal" alanların bir sürü vardır. Bu kısmi görüşler, Razor manzarası olarak ilk uygulanmış olanlardır. Daha sonra, bir Razor kısmi görünümü kullanarak standart bir ASPX görünümü sayfasında yeni bir özellik uygulamak istedik, ancak ASPX görünümü motoru, bir Razor görünümü kullanmak yerine kısmi bir Razor görünümü oluşturamıyor. App_Code klasörüne bir MVC yardımcı dosyası ekledim. özelliği sağlayan bir yöntem. Bu yöntem, MVC4'e yükselttikten sonra hataya neden olan şeydir. Bu yöntem tarafından işlenen özellik sayfası, bir Razor görünüm sayfasına dönüştürdüğüm şeydir, bu yüzden bugün yapmam gereken şeyin kodu bu yöntemden bir Razor kısmi görünümüne taşıması olduğunu fark ettim. Bu sorun düzeltildi, ancak, Hala bu yardımcı yöntemler ile render için Razor motorunda bir hata olduğunu koruyorum.

0

bu yöntemi aşağı dummied. Yukarıdaki URL'yi bir değişkene koyarsam, hatayı alıyorum.

Url olan bir dizeyi ayrıştırmaya çalışırken başarısız oluyor.

Yığın izleme:

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) 

[GÜNCELLEME] (soruna çalışan TagBuilder kullanarak ve Html.Raw ile render çalıştı); aynı sonucu aldım.

@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

İlginç, bir framework sınıfı/yöntemi olan HelperPage.WriteAttributeTo' içinde hata oluyor. MVC4'ün boş değerlere sahip öznitelikler için bazı gelişmiş destek eklediğini biliyorum. Muhtemelen burada bir böcek var. –

+0

Ben de öyle düşünüyordum. – Silkster

+0

Belki, ancak bir soruda yayınlamak için çok fazla bilgi var. – Silkster

İlgili konular