2012-02-23 7 views
14

В документации ASP.NET MVC говорит, что вы должны сделать что-то вроде этого, когда есть ссылка в представленииПреимущества бритвы заменить (@href)

<a href="@href("~/SubPage")">Subpage</a>. 

Бритва двигатель заменяет @href("~/SubPage") к /Subpage.

Что такое преимущество сделать это таким образом, вместо того, чтобы

<a href="/SubPage">Subpage</a>. 

В подобных случаях, а в других (например, создание формы) зачем использовать бритву двигатель вместо того, чтобы писать прямо, что вы хотите. Я думаю, что быстрее на стороне сервера печатать что-то прямо, что позволяет движку его генерировать.

ответ

24

Если приложение запускается в подкаталоге, Бритва @href создаст правильную ссылку, как это:

www.myapp.com/subfolder/SubPage 

Если вы сами написать свою ссылку будет, как это и не будет работать:

www.myapp.com/SubPage 

Thats потому, что ~ будет заменен вашим корнем приложения Razor.

+0

И если я напишу ссылку справа с подпапкой или приложение не находится в подпапке, есть ли какие-либо преимущества? –

+6

Нет, я так не думаю. Но вы теряете гибкость - вы никогда не сможете изменить имя подпапки, не просматривая весь проект, где вы записали это имя. Я очень отрицаю это. – Marc

+1

+ 1- этот маленький драгоценный камень (@href) - это SOO, которого не замечают многие разработчики (если не использовать @ Html.ActionLink()). дал бы вам двойное голосование, если бы я мог :) –

0

Я просто написать

<a href="SubPage">Subpage</a>

Я не могу понять, любой отрицательный запасной вариант

+1

Если вы определили настраиваемые маршруты, это может привести к поломке ссылок. Например, если у меня есть настраиваемый маршрут 'a/b/c', сопоставленный с действием' SubPage' 'PageController', а моя ссылка href -' OtherPage', браузер будет перейти к 'a/b/OtherPage', хотя , в этом контексте предполагаемая цель, скорее всего, будет «Страница/OtherPage». Речь идет не только о том, как в настоящее время написано ваше приложение, а о том, как писать все приложения таким образом, который адаптивен и может изящно ухудшаться. Это делает приложение немного более портативным, а также более легко поддерживает будущие изменения. – defines

2

Метод ActionLink не может принимать HTML.

Вам необходимо сделать обычную тег <a> и использовать @Url.Action(...) для href.

<a href="@Url.Action("ActionName", "ControllerName")">Link Text</a>. 
Смежные вопросы