Как указать название области в ссылке действия?

156

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

Джереми
источник

Ответы:

245

Догадаться..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{})
Джереми
источник
3
@ Pure.Krome - да. Ничего интуитивного в этом нет!
Джереми
3
Убедитесь, что до или после Areaname нет пробелов. В противном случае он просто проигнорирует это ... и затем заставит вас задаться вопросом четыре часа, что не так ... как я.
Петр Кула
Как вы добавляете туда параметры?
Йорр
Как это выглядит в переводе на ссылку? Я имею в виду - когда форма отображается и возвращается клиенту.
FrenkyB
79

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

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

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

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

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

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

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

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

Субхаш Рао
источник
11

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

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{})
Sreejith
источник
6

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

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

@Html.Action("Something", "Somewhere", awesomeArea)
@Html.ActionLink("Stuff", "FooBar", awesomeArea)
dav_i
источник
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>
}
Энтони Харт
источник
Явная настройка htmlAttributes:работала очень хорошо для использования нескольких параметров.
Трэвис Дж
2

Если вы не можете использовать стандартную ссылку веб-приложения, такую ​​как About, Home, Contac и т. Д. Из области. Вы меняете линии

@Html.ActionLink("Ana Sayfa", "Index", "Home", new { area = "" }, new {})

из

Views \ Shared_Layout.cshtml

ErdincDonmez
источник
1

В моем приложении ASP Net Core я просто добавляю область к атрибутам html следующим образом:

@Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" , id = @Model.ID, name = @Model.name })
Moleius
источник
0

С помощью

@Html.ActionLink("DisplayText", "ActionName", "ControllerName", new { area = "AreaName"}, null)

Добьетесь того, что вы хотите.

DisplayText - это то, что будет отображаться (так же, как <a href="#">DisplayText</a>), ActionName - это метод, вызываемый в контроллере, а ControllerName - это, очевидно, контроллер, который вы хотите вызвать! Следующим параметром является «Значение маршрута», где вы бы добавили свою область. Если вы находитесь в области и хотите, Home/Indexнапример, вернуться к своему корню , вы бы оставили значение в виде пустой строки, например new { area = ""}. Конечное значение - «Атрибуты HTML», где вы добавляете класс, если хотите, и должны быть, nullесли у вас нет атрибутов для добавления. Но как последний параметр рассматривается как «Атрибуты HTML»; для того, чтобы значения маршрута были распознаны, это должно бытьnull

Роб П
источник