Почему Html.Raw ускоряет амперсанд в привязном теге в ASP.NET MVC 4?
У меня есть URL, который я бы хотел отобразить в теге привязки как есть в представлении Razor. Я бы подумал, что Html.Raw - это путь:
@{
string test = "http://someurl.com/someimage.png?a=1234&b=5678";
}
<div>
<a href="@Html.Raw(test)">Test</a>
</div>
Но это не работает. Амперсанд получает кодировку и HTML отображается как:
<div>
<a href="#" onclick="location.href='http://someurl.com/someimage.png?a=1234&b=5678'; return false;">Test</a>
</div>
Странно, что если я вызову Html.Raw за пределами привязанного тега, вывод HTML будет таким, как ожидалось:
<div>
@Html.Raw(test)
<div>
отображается как:
<div>
http://someurl.com/someimage.png?a=1234&b=5678
</div>
Может кто-нибудь объяснить, почему это?
Edit:
Пробовал несколько других вещей и обнаружил, что следующее работает как ожидалось:
<div data-url="@Html.Raw(test)"></div>
выходы:
<div data-url="http://someurl.com/someimage.png?a=1234&b=5678"></div>
Чтобы добавить немного больше контекста, моя цель состоит не в том, чтобы использовать URL-адрес в теге привязки, так как href
может быть закодирован и по-прежнему работать в формате HTML (я просто использовал анкерный тег В качестве примера). Скорее, я хочу использовать URL-адрес в теге значения <object> <param>
для объекта Flash. Объект Flash неправильно распознает URL, закодированный в HTML, но я не могу правильно получить исходный URL.
Я в недоумении. Полагаю, время разломать исходный код MVC...
Ответы
Ответ 1
Это происходит потому, что что-то в конвейере (я бы предположил, что бритва, но мне нужно его искать) атрибут кодирует все... значения атрибутов. Это не должно влиять на доступ браузера к желаемому местоположению.
Вы можете проверить это с помощью перегрузки @Html.ActionLink(text, action, routeAttributes)
.
@Html.ActionLink("Test", "Index", new { tony = "1", raul = 2 })
выходы
<a href="/?tony=1&raul=2">Test</a>
Что касается вашего редактирования, вам просто нужно сделать всю часть <param>
вашего исходного значения.
@{
var test = "<param src=\"http://someurl.com/someimage.png?a=1234&b=5678\">";
}
<div>
<object>
@Html.Raw(test)
</object>
</div>
Ответ 2
Вот так:
@{
string test = "http://someurl.com/someimage.png?a=1234&b=5678";
}
<div>
<a href="@Html.Raw(Html.AttributeEncode(test))">Test</a>
</div>
создает допустимую разметку:
<div>
<a href="http://someurl.com/someimage.png?a=1234&b=5678">Test</a>
</div>
Но это не работает. Амперсанд получает кодировку, а HTML - отображается как:
Но именно так должна выглядеть действительная разметка. Амперсанд должен быть закодирован при использовании в качестве атрибута. Не волнуйтесь, браузер прекрасно поймет этот URL.
Обратите внимание, что следующая недопустимая разметка, поэтому вы не хотите:
<div>
<a href="http://someurl.com/someimage.png?a=1234&b=5678">Test</a>
</div>
Ответ 3
Try
<div>
<a href="@MvcHtmlString.Create(test)">Test</a>
</div>
Ответ 4
просто попробуйте ниже...
Он работает отлично.
@{
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>
Ответ 5
почему вы не используете jquery для размещения 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;
});
});
в контроллере
public ActionResult Fetch(string a, string b)
{
//write required codes here
return View();
}