Атрибуты 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 Coreproject и поэтому не может использовать . Вместо этого вам нужно использовать

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.

Другие вопросы по тегам