在url中传递名称而不是id会引发错误

时间:2019-06-18 15:52:31

标签: c# asp.net-mvc razor

我有一个列表在我的视图中显示作业,当我单击该链接时,它应该带我到其他页面以显示完整的详细信息,并且在浏览器的URL中应显示如下所示

// mysite.com/jobs/auto-damage-adjuster-trainee-houston-and-surrounding-cities。

为了实现这一点,我试图在单击时提交表单并将隐藏值传递给控制器​​,但是它总是会引发404错误。总是将id null传递给job actionresult。

Index.cshtml-

@model List<JobPortal.Models.MyDB>
@{
    ViewBag.Title = "Current List";
 }

 @using (Html.BeginForm())
 {
     @Html.AntiForgeryToken()
     @foreach (var list in Model)
     {
       <div class="row">
           <div class="flexcontainer">
              @Html.Partial("_MySharedView", list)
           </div>
       </div>
    }
 }

共享视图:

@model JobPortal.Models.MyDB
@if (Model.JDetails.Count > 0)
{
   @foreach (var item in JDetails)
{
   @{ var Url = @item.title.Replace(" ", "-").Replace('/', '-').Replace('?', '-').Replace(':', '-');}
    <form id="Jobs-@item.id" action="~/Index?id=@item.id" method="post">
    <input type="hidden" name="id" id="id" value=@item.id />
    <strong><a href="~/Jobs?@Url" onclick="document.getElementById('Jobs-@item.id').submit();">@item.title</a></strong>
    </form>
  }
}

控制器-

 [HttpPost]
 public ActionResult Index(int? id)
 {
     var newId = (int)id;
     return RedirectToAction("Jobs", new { id = newId });
  }


  [HttpGet]
  public ActionResult Jobs(int? id)
  {
      var allDetails = _db.MyDB.Where(p => p.id == id).FirstOrDefault();
      return View(allDetails);
   }

路由配置

        routes.MapRoute(
            "Jobs",
            "{controller}/{action}/{name}",
        new { contrller = "jobController", action = "Jobs", name = UrlParameter.Optional }
        );

3 个答案:

答案 0 :(得分:0)

在您的控制器中,该ID必须为string才能起作用

   [HttpGet]
   public ActionResult Jobs(string name)
   {
      var allDetails = _db.MyDB.Where(p => p.name == name).FirstOrDefault();
      return View(allDetails);
   }

答案 1 :(得分:0)

在您的共享视图中进行更改:

<form id="Jobs-@item.id" action="~/Index?id=@item.id" method="post">

至:

<form id="Jobs-@item.id" action="~/Index/@item.id" method="post">

答案 2 :(得分:0)

此代码运行时

return RedirectToAction("Jobs", new { id = newId });

到达此处后,id保留的值将丢失

public ActionResult Jobs(int? id)

因为在路由表中,您没有指定id,而是仅指定name

routes.MapRoute(
"Jobs",
"{controller}/{action}/{name}",
new { contrller = "jobController", action = "Jobs", name = UrlParameter.Optional });

我可以建议您测试一下此快速修复程序吗?

在控制器中:

[HttpPost]
public IActionResult Index(int id)
{
    var name = _db.MyDB.Where(p => p.id == id).FirstOrDefault();
    return RedirectToAction(nameof(Jobs), new { id, name });
}

[HttpGet]
public IActionResult Jobs(string name, int id)
{
    var allDetails = _db.MyDB.Where(p => p.id == id).FirstOrDefault();
    return View(allDetails);
}

并在您的路由表中:

routes.MapRoute(
    name: "Jobs",
    template: "{controller}/{name}/{id}",
    defaults: new { controller = "jobController", action="Jobs" });

您的代码仍有很多改进之处,但是我希望这可以澄清您的问题。编码愉快!