Атрибуты asp-controller и asp-action не работают
Кто-нибудь знает, что мне не хватает, почему эти теги asp-controller и asp-action у меня не работают. Я реализую проект в ASP.NET MVC Core.
Это не стреляет
<a asp-controller="App" asp-action="Trips" class="btn btn-lg btn-success">Go to Trips</a>
Бритва отлично работает
@Html.ActionLink("Go to Trips", "Trips", "App", new object { }, new { @class = "btn btn-lg btn-success" })
Нужно ли мне настроить какой-то сервис, чтобы это работало. А также, какой путь предпочтительнее? Бритва довольно популярна в MVC. Являются ли эти asp-теги новым, лучшим способом?
7 ответов
Немного покопавшись, я обнаружил, что атрибуты asp-controller и asp-action называются помощниками тегов привязки и являются частью
Microsoft.AspNetCore.Mvc.TagHelpers пространство имен
Видимо, это альтернатива использованию Razor. Я смог решить эту проблему, создав файл _ViewImports.cshtml и добавив в файл следующее:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
После этого помощники тегов привязки были распознаны, и кнопка начала работать, как и ожидалось.
При работе с областями мне пришлось скопировать _ViewImport в новую область \MyArea\Views
Добавление
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
в начало файла cshtml работает.
мне потребовалось время, чтобы понять это - но если вы, как я, все еще боретесь с
Cannot resolve symbol 'addTagHelper'
попробовав , вы, вероятно, используете
ASP.NET MVC
проект вместо
ASP.NET Core
project и поэтому не может использовать . Вместо этого вам нужно использовать
TL; DR;
Если принятый ответэтот ответ не сработал для вас, используйте htmlhelperhtmlhelper (*)
@using (Html.BeginForm("Trips", "App"))
{
...
}
.. вместо taghelpertaghelper (**)
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<form asp-controller="App" asp-action="Trips">
...
</form>
(*) относится к
ASP.NET MVC 5.2
(**) относится к
ASP.NET Core 2.1, 1.0, 1.1, 2.0, 2.2, 3.0, 3.1, 5.0
У меня такая же проблема. Кроме того, манипуляции с_ViewImports.cshtml
не помогло. Тегхелперы вроде этого:
<a asp-controller="Contact" asp-action="GetContacts">Contact Form</a>
не перешел к методу контроллера:
public class ContactController : Controller
{
public IActionResult GetContacts()
{
return View();
}
}
Все, что мне нужно было сделать, это немного обновитьStartup.cs
с помощьюMapControllerRoute
метод
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute(name:"default", pattern:"{controller}/{action}");
});
@{
IDictionary<string, string> routeData = new Dictionary<string, string>();
routeData.Add("Id", point.Id.ToString());
routeData.Add("Name", point.Name);
routeData.Add("Address", point.Address);
}
<a asp-page="./AddCollectionPoint" asp-page-handler="Edit" asp-all-route-data="@routeData">
На страницах Razor есть файлы modelcshtml.cs, унаследованные от "PageModel", поэтому в моем случае мои методы действий в этих файлах не распознавались... Я заменил asp-controller на asp-page и asp-action на asp-page-handler. Плюс добавил строку для маршрута по умолчанию в startup.cs.
app.UseEndpoints(endpoints =>
{ endpoints.MapRazorPages(); endpoints.MapControllerRoute("default","{controller=Home}/{action=Index}");});
и это сработало.
Если вы используете представления в Areas, обязательно сделайте копию файла _ViewImports.cshtml из папки /Views, а также скопируйте его в папку /Areas//Views.