【问题标题】:Routing problems in my ASP.NET Core application - missing argument我的 ASP.NET Core 应用程序中的路由问题 - 缺少参数
【发布时间】: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


【解决方案1】:

我希望您的问题出在Index.cshtml 文件中,您在该文件中指定要在路由中使用@employee.id

asp-routeid="@employee.id"

将这两个更改为:

asp-route-id="@employee.id"

区别在于routeid 之间的-。有关 Form Tag Helper 如何使用路由参数的更多信息,请参阅文档:

提供asp-route-&lt;Parameter Name&gt; 属性,其中&lt;Parameter Name&gt; 添加到路由值。

【讨论】:

    【解决方案2】:

    我们需要经历的场景太多了,所以我宁愿在这里写,而不是多条评论:

    1. 放一个断点,运行调试每一行。看看有没有出错。

      对于这种情况,我怀疑这里出了问题:

      if (model == null)
      {
          return RedirectToAction("Index");
      }
      

      您的模型可能为空,因此它重定向回主索引。

    2. 由于使用控制器名称作为“Employee”,而不是“Home”,与 tutorialpoint 相比,您的路由可能会在某处中断。检查你的路由文件,默认情况下应该是这样的:

      routes.MapRoute(
          name: "default_route",
          template: "{controller}/{action}/{id?}",
          defaults: new { controller = "Home", action = "Index" });
      

      你在里面做了什么改变吗?

    【讨论】:

    • 谢谢。我现在发布了完整的控制器。我试图编辑路由配置。也以“员工”作为默认值,它不起作用。调试向我显示,id 始终为“0”,我选择哪个员工并不重要。任何想法?感谢您的帮助!
    • @dafna 看看 Kirk 的回答,这是另一种情况
    猜你喜欢
    • 1970-01-01
    • 2020-08-07
    • 2022-01-05
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多