修复 Asp.Net MVC 5 中路由 url 的错误

Fix error with route url in Asp.Net MVC 5

我有这个数据模型: 所以一个项目有很多里程碑。 我所做的是这样的:当我进入一个特定项目的细节时,我可以为它设置 add/create 里程碑,如图所示: 当我单击 "Create Milestone" 时,我导航到可以为这个特定项目创建里程碑的视图,当我单击保存时,它会自动为这个项目保存。这里的 HttpPost 方法:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateMilestone([Bind(Include = "Name,Description,FromDate,DueDate,Finished,ProjectID")] Milestone milestone, int? id)
    {
        if (ModelState.IsValid)
        {
            var forProject = db.Projects.Where(x => x.ID == id).FirstOrDefault();
            if (forProject != null)
            {
                milestone.Project = forProject;
                db.Milestones.Add(milestone);
                db.SaveChanges();
                return RedirectToAction("Details", forProject);
            }
            else
            {
                return HttpNotFound();
            }
        }
        else
        {
            return View(milestone);
        }
    }

这是 CreateMilestone 视图的屏幕截图,并关注 url(它是 localhost:xxxxx/Projects/CreateMilestone/3002)。 CreateMilestone 方法中的 id 参数用于项目 ID,在 url 中,id (3002) 也用于项目。

我正在尝试让应用程序导航到该特定项目的详细信息视图我刚刚添加了一个里程碑,我确实这样做了! 如您所见,它有效:

但是:看看url!而不是本地主机:xxxxx/Projects/Details/3002 它是:http://localhost:55623/Projects/Details/3002?Milestones=System.Collections.Generic.HashSet%601%5BTheProjectManager.Models.Milestone%5D&Users=System.Collections.Generic.HashSet%601%5BTheProjectManager.Models.ApplicationUser%5D&ProjectName=Testing&Description=Testing%20data

那么,如何在添加新里程碑后导航到详细信息视图时使 url 像:localhost:xxxxx/Projects/Details/3002?

更新: 获取详细信息:

public ActionResult Details(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Project project = db.Projects.Find(id);
        if (project == null)
        {
            return HttpNotFound();
        }
        return View(project);
    }

和获取 CreateMilestone:

public ActionResult CreateMilestone(int? id)
    {
        var forProject = db.Projects.Where(x => x.ID == id).FirstOrDefault();

        if (forProject != null)
        {
            return View();
        }
        else
        {
            return HttpNotFound();
        }            
    }

在这一行

return RedirectToAction("Details", forProject);

您正在重定向到 Details 操作并作为参数发送 "Project" 序列化为查询字符串的对象。您只能使用 id 而不是完整对象。但是您还需要更改 Details 操作以接受 int 作为参数而不是 Project class

而不是return RedirectToAction("Details",forProject); 试试这个 return RedirectToAction("Details", new { id = id });