2012-05-16 21 views
6

Tengo un método auxiliar en un archivo en el directorio App_Code. El método funciona perfectamente bien en MVC 3, pero después de actualizar a MVC 4 no lo hace. Está fallando en el primer bloque @if() ...El método Razor helper no funciona después de la actualización de MVC 3 a 4

[Editar] Esto parece un error de análisis en el motor Razor. Obtengo el error 'Referencia de objeto no configurado a una instancia de un objeto' cuando todos mis objetos y sus propiedades NO son nulos. Supongo que tendré que ir directamente a Microsoft.

[Editar] El mensaje de error es la antigua 'Referencia de objeto no configurada para una instancia de un objeto'. Esto es extraño porque cada objeto Y propiedad en la condición son válidos y no nulos.

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

[ACTUALIZACIÓN] he cambiado el código un poco y ahora es aún más extraño. Estoy recibiendo el mismo error que el anterior en la línea de:

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

contactTwitterHandle y contactTwitterHandle.Handle son ambos no nulo.

@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

¿Presumiblemente "falla" con un mensaje de error? ¿Qué es? –

+0

Eso podría ser útil. Lo pondré en la pregunta anterior. – Silkster

+0

Bueno, parece muy probable entonces que 'contactTwitterHandle' sea nulo. Encienda su depurador y descubra por qué es así. –

Respuesta

2

Encontré la solución para este problema, pero primero un poco de historia. Para este proyecto particular de MVC, decidimos comenzar a implementar Razor gradualmente. La aplicación tiene muchas áreas "modales" que se completan haciendo una llamada AJAX para obtener una vista parcial. Estas vistas parciales fueron las primeras en implementarse como vistas Razor. Más tarde, queríamos implementar una nueva característica en una página de vista ASPX estándar usando una vista parcial Razor, pero el motor de vista ASPX no puede renderizar una vista Razor parcial, así que en lugar de usar una vista Razor agregué un archivo MVC helper en la carpeta App_Code con un método que representa la característica. Este método es el que causa el error después de actualizar a MVC4. La página con la característica representada por este método es lo que estoy convirtiendo a una página de vista Razor, así que hoy me di cuenta de que todo lo que tengo que hacer es mover el código de ese método a una vista parcial de Razor. Esto solucionó el problema, sin embargo, Todavía mantengo que esto es un error en el motor Razor para renderizar con métodos auxiliares.

0

I dummied por el método para esto:

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

Si quito @tHandle de la línea:

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

Se analizará bien. Si coloco la URL anterior en una variable, entonces obtengo el error.

Falló al intentar analizar una cadena que es una Url.

Seguimiento de la pila:

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) 

[ACTUALIZACIÓN] intentado trabajar en torno al tema usando TagBuilder y de la representación con Html.Raw(); obtuvo el mismo resultado.

@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

Interesante, el error está sucediendo en 'HelperPage.WriteAttributeTo', una clase/método de framework. Sé que MVC4 agrega un soporte sofisticado para atributos con valores vacíos. Posiblemente hay un error aquí. –

+0

Eso es lo que estaba pensando, también. – Silkster

+0

Quizás, pero es mucha información para publicar en una pregunta. – Silkster

Cuestiones relacionadas