Почему 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&amp;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&amp;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&amp;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();

    }