2012-08-15 16 views
15

Tengo una URL que me gustaría mostrar en una etiqueta de anclaje tal como está en una vista Razor. Hubiera pensado que Html.Raw sería el camino a seguir:¿Por qué Html.Raw se escapa del ampersand en la etiqueta de anclaje de ASP.NET MVC 4?

@{ 
    string test = "http://someurl.com/someimage.png?a=1234&b=5678"; 
} 

<div> 
    <a href="@Html.Raw(test)">Test</a> 
</div> 

Pero esto no funciona. El signo se codifica y el HTML es interpretado como:

<div> 
    <a href="http://someurl.com/someimage.png?a=1234&amp;b=5678">Test</a> 
</div> 

Lo extraño es que si hago la llamada Html.Raw fuera de la etiqueta de anclaje, la salida HTML es el esperado:

<div> 
    @Html.Raw(test) 
<div> 

se representa como:

<div> 
    http://someurl.com/someimage.png?a=1234&b=5678 
</div> 

Puede alguien explicar por qué esto es?

Editar:

intentado algunas otras cosas, y encontraron que los siguientes trabajos como se esperaba:

<div data-url="@Html.Raw(test)"></div> 

salidas:

<div data-url="http://someurl.com/someimage.png?a=1234&b=5678"></div> 

Para añadir un poco más de contexto, mi objetivo no es utilizar la URL en una etiqueta de ancla, ya que href s pueden estar codificadas en HTML y seguir funcionando (acabo de utilizar el caso chor tag como ejemplo). En su lugar, deseo utilizar la URL en una etiqueta de valor <object> <param> para un objeto Flash. El objeto Flash no reconoce correctamente la URL codificada en HTML, pero no puedo hacer que la URL en bruto se emita correctamente.

Estoy perdido. Hora de romper el código fuente MVC supongo ...

+0

posible duplicado de [¿Por qué se MVC 4 Razor escapando de signo cuando se utiliza HTML.Raw en un atributo de título] (http://stackoverflow.com/questions/12321616/why-is-mvc-4-razor- escaping-ampersand-when-using-html-raw-in-a-title-attribute) –

Respuesta

11

Esto está sucediendo porque algo en la tubería (supongo que la maquinilla de afeitar, pero tendría que buscarlo) atributo codifica todo ... atributo val ues. Sin embargo, esto no debería afectar al navegador para que llegue a la ubicación deseada.

Puede probar esto con la sobrecarga @Html.ActionLink(text, action, routeAttributes).

@Html.ActionLink("Test", "Index", new { tony = "1", raul = 2 }) 

salidas

<a href="/?tony=1&amp;raul=2">Test</a> 

En lo que respecta a su edición, sólo tiene que hacer todo el <param> parte de su valor en bruto.

@{ 
    var test = "<param src=\"http://someurl.com/someimage.png?a=1234&b=5678\">"; 
} 

<div> 
    <object> 
    @Html.Raw(test) 
    </object> 
</div> 
+0

¿Esta respuesta está actualizada? Acabo de probar el '@ Html.ActionLink (" Test "," Index ", nuevo {tony =" 1 ", raul = 2})' en VS2013, MVC5 y la salida fue 'Test' ... –

3

Trate

<div> 
    <a href="@MvcHtmlString.Create(test)">Test</a> 
</div> 
+0

Sin suerte. Obtengo el mismo comportamiento que Html.Raw(). –

+0

@JoeWaller Al principio no funcionaba para mí, pero después de actualizar Razor y MVC a la última versión (lo cual era un problema porque rompía las cosas ...), tanto Html.Raw() como MvcHtmlString.Create() funcionaban. – bets

0

¿por qué no usar jQuery para publicar la URL:

$(function() { 
    $('form').submit(function() { 
     $.ajax({ 
      url: this.action, 
      type: this.method, 
      data: { a:'firstvalue', b: 'secondvalue'}, 
      success: function (result) { 
//code for successful result 
      } 
     }); 
     return false; 
    }); 
}); 

en el controlador

public ActionResult Fetch(string a, string b) 
    { 
     //write required codes here 
      return View(); 

    } 
4

De esta manera:

@{ 
    string test = "http://someurl.com/someimage.png?a=1234&b=5678"; 
} 

<div> 
    <a href="@Html.Raw(Html.AttributeEncode(test))">Test</a> 
</div> 

produce marcado válido:

<div> 
    <a href="http://someurl.com/someimage.png?a=1234&amp;b=5678">Test</a> 
</div> 

Pero esto no funciona. El ampersand se codifica y el código HTML es representado como:

Pero así es exactamente como debería ser un marcado válido. El ampersand debe estar codificado cuando se usa como atributo. No se preocupe, el navegador entenderá perfectamente esta url.

en cuenta que la siguiente es marcado no válido, por lo que no quiere esto:

<div> 
    <a href="http://someurl.com/someimage.png?a=1234&b=5678">Test</a> 
</div> 
+0

El ejemplo es engañoso, él está tratando de usar una configuración '' para un objeto flash y él piensa que no está recogiendo el valor correctamente (¿tal vez una doble codificación en flash?) –

+0

@NickLarsen, pero el siguiente es ** marcado inválido * *: ''. Pruebe cualquier validador de HTML y le dirá esto. ¿Por qué alguien querría producir un marcado inválido? Si la película Flash no comprende el marcado válido, es posible que esta película flash requiera reparación. –

+0

es un buen punto a menos que no tenga acceso para cambiar la parte del flash. –

1

acaba de tratar a continuación ... Funciona perfecto.

@{ 
    string test = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token="[email protected]; 
} 
<div> 
    <a href="@Html.Raw(System.Web.HttpUtility.HtmlDecode(test))">@Html.Raw(System.Web.HttpUtility.HtmlDecode(test))</a> 
</div> 
Cuestiones relacionadas