2010-01-10 2 views
149

У меня есть общая мастер-страница, которую я использую из двух разных областей в моем приложении mvc 2. На главной странице есть ссылка на действие, которая в настоящее время указывает контроллер и действие, но, конечно, ссылка не работает, если я ошибаюсь. Я не вижу перегрузки для actionlink, который принимает параметр области, можно ли это сделать?Как указать название области в ссылке действия?

ответ

233

Фигурные его ..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{}) 
+1

Да, это хороший подход. – Ravia

+16

AH !!! это сложный 'new {}' в конце я забываю включать! –

+3

@ Pure.Krome - да. Ничего интуитивного в этом нет! – Jeremy

77

Что-то я столкнулся сразу после того, что я полагаю, другие могут столкнуться: Если необходимо связать с в пределах зоны действия не в районе, вам все равно необходимо указать область как пустую строку.

Например, я переместил некоторый код MVC в область и обнаружил, что мне нужно обновлять URL-адреса на главной странице, ссылающейся на другие страницы сайта.

Чтобы указать URL к чему-то не в зоне, используйте

Html.ActionLink("home", "Index", new { area = "", controller = "Home" }) 
+4

Это очень хороший совет! Но это дает ожидаемые результаты с MVC 2 .. Небольшая коррекция - Html.ActionLink («home», «Index», new {area = «", controller = "Home"}) –

9

В MVC2 давая area="root" работал для меня, как показано ниже

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{}) 
4

Вот то, что я придумал, как решение позволяют пользователю связываться с предварительно построенными системами аутентификации.

Каждая из моих областей имеет версию файла _LoginPartial.cshtml.

Возможно, я мог заставить приложение использовать одну версию файла, однако я все время сталкивался с ошибками при попытке использовать единый логин.

Это лишь незначительная модификация исходного сгенерированного входа в систему, но, похоже, он хорошо работает при использовании в определенных областях.

Вот код, который привыкает во всех из них:

@if (Request.IsAuthenticated) 
{ 
    <text> 
    Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", new { area = "" }, htmlAttributes: new { @class = "username", title = "Manage" })! 
    @using (Html.BeginForm("LogOff", "Account", new { area = "" }, FormMethod.Post, new { id = "logoutForm" })) 
{ 
     @Html.AntiForgeryToken() 
     <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a> 
} 
    </text> 
} 
else 
{ 
    <ul> 
     <li>@Html.ActionLink("Register", "Register", "Account", new { area = "" }, htmlAttributes: new { id = "registerLink" })</li> 
     <li>@Html.ActionLink("Log in", "Login", "Account", new { area = "" }, htmlAttributes: new { id = "loginLink" })</li> 
    </ul> 
} 
+0

Явное определение 'htmlAttributes:' работало очень хорошо для использования нескольких параметров. –

12

Использование:

Html.ActionLink("Text", "ActionName", "ControllerName", new { Area = "AreaName" }, null) 

Примечание: четвёртое параметр должен пройти маршрут Values, если вы передаете пустой параметр он рассмотрит корневую структуру, и если вы пройдете соответствующее значение, он будет использовать его как область.

Также не забудьте использовать null или new{} в качестве 5-го параметра из-за прохождения null или new {} при создании ссылки действий не перегружать метод (text,action,controller,route data) или его (text,action,controller,route data,html attribute) так использовать правильный метод

6

ловкий трюк вы можете сделать если вы много используете область в представлении, определяете ее как переменную в верхней части:

@{ var awesomeArea = new { area = "Awesome" }; } 

@Html.Action("Something", "Somewhere", awesomeArea) 
@Html.ActionLink("Stuff", "FooBar", awesomeArea)