【发布时间】:2017-11-08 07:21:57
【问题描述】:
我正在尝试执行本教程:https://www.tutorialspoint.com/asp.net_core/asp.net_core_razor_edit_form.htm
我有一个 NET Core Web 应用程序和一个包含员工(id、姓名)的小列表。我创建了 Index.cshtml、Details.cshtml 和 Edit.cshtml。 数据库连接正常。 当我尝试单击员工姓名后面的编辑或详细信息链接时,路由似乎不起作用。我只是得到空站点。
索引.cshtml
@using MyApp.Controllers
@model HomePageViewModel
@{
ViewBag.Title = "Home";
}
<h1>Welcome!</h1>
<table>
@foreach (var employee in Model.Employees)
{
<tr>
<td>@employee.name</td>
<td>
<a asp-controller="Employee" asp-action="Details"
asp-routeid="@employee.id">Details</a>
<a asp-controller="Employee" asp-action="Edit"
asp-routeid="@employee.id">Edit</a>
</td>
</tr>
}
</table>
编辑.cshtml
@model MyApp.Models.Employees
@{
ViewBag.Title = $"Edit {Model.name}";
}
<h1>Edit @Model.name</h1>
<form asp-action="Edit" method="post">
<div>
<label asp-for="name"></label>
<input asp-for="name" />
<span asp-validation-for="name"></span>
</div>
<div>
<input type="submit" value="Save" />
</div>
</form>
完整的控制器
using Microsoft.AspNetCore.Mvc;
using MyApp.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace MyApp.Controllers
{
public class EmployeeController : Controller
{
public ViewResult Index()
{
var model = new HomePageViewModel();
using (var context = new FirstAppDemoDbContext())
{
SQLEmployeeData sqlData = new SQLEmployeeData(context);
model.Employees = sqlData.GetAll();
}
return View(model);
}
public IActionResult Details(int id)
{
var context = new FirstAppDemoDbContext();
SQLEmployeeData sqlData = new SQLEmployeeData(context);
var model = sqlData.Get(id);
if (model == null)
{
return RedirectToAction("Index");
}
return View(model);
}
[HttpGet]
public IActionResult Edit(int id)
{
var context = new FirstAppDemoDbContext();
SQLEmployeeData sqlData = new SQLEmployeeData(context);
var model = sqlData.Get(id);
if (model == null)
{
return RedirectToAction("Index");
}
return View(model);
}
[HttpPost]
public IActionResult Edit(int id, EmployeeEditViewModel input)
{
var context = new FirstAppDemoDbContext();
SQLEmployeeData sqlData = new SQLEmployeeData(context);
var employee = sqlData.Get(id);
if (employee != null && ModelState.IsValid)
{
employee.name = input.Name;
context.SaveChanges();
return RedirectToAction("Details", new { id = employee.id });
}
return View(employee);
}
}
public class SQLEmployeeData
{
private FirstAppDemoDbContext _context { get; set; }
public SQLEmployeeData(FirstAppDemoDbContext context)
{
_context = context;
}
public void Add(Employees emp)
{
_context.Add(emp);
_context.SaveChanges();
}
public Employees Get(int ID)
{
return _context.Employees.FirstOrDefault(e => e.id == ID);
}
public IEnumerable<Employees> GetAll()
{
return _context.Employees.ToList<Employees>();
}
}
public class HomePageViewModel
{
public IEnumerable<Employees> Employees { get; set; }
}
public class EmployeeEditViewModel
{
[Required, MaxLength(80)]
public string Name { get; set; }
}
}
应用程序使用参数 (而不是 id 1 或 2...)请求 localhost:xxxx/Employee/Edit,并重定向到我在 localhost:xxxx/Employee 处的索引列表。我期望 localhost:xxxx/Employee/Edit/1 但似乎缺少 id 参数。
我在 _ViewImports.cshtml 中使用 @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
我可以尝试什么?如果您需要更多信息,请告诉我!
【问题讨论】:
-
在
public IActionResult Edit(int id)里面放一个断点,在debug中运行,看看是不是跑到这个方法里了? -
由于将Controller更改为Employee,可能会导致路由出现问题,发布整个EmployeeController.cs会更容易
标签: asp.net-core