我有一个列表在我的视图中显示作业,当我单击该链接时,它应该带我到其他页面以显示完整的详细信息,并且在浏览器的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 }
);
答案 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" });
您的代码仍有很多改进之处,但是我希望这可以澄清您的问题。编码愉快!