Core 2.0 MVC taghelper генерирует ссылки без href
Я новичок в платформе Core 2.0 (но не в MVC) и расширяю демонстрационный проект ContosoUniversity, чтобы включить в него некоторые требуемые функциональные возможности, чтобы увидеть, будет ли это путь для готовящегося приложения, которое я собираюсь создать. Одна из этих вещей - Области.
Вместо того, чтобы иметь демонстрационный контроллер "ученики", модели и представления в их папках по умолчанию, я создал область "Образование" и поместил StudentController в его папку "Контроллеры", модели в папке "Модели", а затем использовал Scaffolding для создания представлений. там: Структура папок Области
Метод Configure в Startup.cs был изменен для маршрутизации области настройки:
// Map static routes
app.UseStaticFiles();
// Map MVC routing
app.UseMvc(routes =>
{
// Area routes
routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);
// Default MVC routing
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
При тестировании приложения оно загружается нормально, и я могу просмотреть страницу /Education/Students, как и ожидалось. Однако при проверке ссылок CRUD, генерируемых платформой, они, по-видимому, не имеют свойства HREF и, как таковые, не работают. Когда я изменяю его на ActionLink, он работает, однако:
@Html.ActionLink("Edit 1", "Edit", "Students", new { area = "Education", id = item.ID }, null) // works
<a asp-action="Edit" asp-area="Education" asp-route-id="@item.ID">Edit 1</a> // does not work
Ссылка, сгенерированная действием, является http://localhost:61541/Education/Students/Edit?id=1.
Тем не менее, чтобы заставить это работать, мне пришлось изменить контроллер, включив в него декораторы маршрутизации, что, из примеров, не должно было быть необходимым, если я правильно понял учебник, потому что текущая Область должна быть привязана к ссылкам. С этим может быть связана основная проблема, но я не могу понять это как-то. Контроллер, индексное действие и действие редактирования:
namespace ContosoUniversity.Areas.Education
{
[Area("Education")]
[Route("Education/[controller]")]
public class StudentsController : Controller
{
private readonly EducationContext _context;
public StudentsController(EducationContext context)
{
_context = context;
}
// GET: Education/Students
public async Task<IActionResult> Index()
{
return View(await _context.Students.ToListAsync());
}
// GET: Education/Students/Edit/5
[Route("[action]")]
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var student = await _context.Students.SingleOrDefaultAsync(m => m.ID == id);
if (student == null)
{
return NotFound();
}
return View(student);
}
Итак, мои вопросы:
- Как я могу заставить taghelpers генерировать правильные ссылки, и
- Я что-то выдумал, когда ActionLinks вообще нужны все виды маршрутизации?
Редактировать: переход к URL-адресу редактирования с помощью ссылки на действие приводит к появлению пустой формы. Модель правильно заполнена в контроллере и возвращает правильный вид, но без заполнения полей с использованием сгенерированного кода:
<input asp-for="LastName" class="form-control" />
Однако, если я добавлю @Model.LastName в HTML, я увижу правильное имя. Что мне не хватает? Каким-то образом модель не связывается правильно?:(