2016-10-17 55 views
0

我有这个datamodel:enter image description here 所以一个项目有很多里程碑。 我做的是这样的:当我进入一个特定项目的细节时,我可以为它添加/创建里程碑,如图中所示:enter image description here 当我点击“创建里程碑”时,我导航到可创建的视图这个具体项目的里程碑,当我点击保存时,它会自动保存为这个项目。在这里,HttpPost方法:修复Asp.Net MVC中路由网址的错误5

[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(它的本地主机:XXXXX /项目/ CreateMilestone/3002)。 CreateMilestone方法中的id参数用于项目ID,而url中的id(3002)也用于项目。 enter image description here

我想让应用程序导航到该特定项目的详细信息视图我只是添加了一个里程碑,我实际上做了! 而且正如你所看到的那样: enter image description here

但是:看看url吧!取而代之的是本地主机:XXXXX /项目/详细信息/ 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

那么,如何才能让网址如:本地主机:XXXXX /项目/详细信息,当我浏览到细节/ 3002加入后查看新的里程碑?

UPDATE: 的获取详细信息:

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(); 
     }    
    } 
+0

向我们展示了GET动词 –

+1

更多的代码和文字,图片少的代码。 –

+0

@mparnisari更新,获取详细信息,并得到CreateMilestone方法 – Arianit

回答

1

代替return RedirectToAction("Details",forProject); 试试这个return RedirectToAction("Details", new { id = id });

2

在这一行

return RedirectToAction("Details", forProject); 

要重定向到Details动作和参数你发送序列化为查询字符串的“Project”对象。您可以仅使用id而不是完整的对象。但你也需要改变Details行动接受INT作为参数,而不是Project

+0

的问题,这是详细方法:公众的ActionResult详细信息(INT ID?) { 如果(ID == NULL){ 返回 新HttpStatusCodeResult(HttpStatusCode.BadRequest); } Project project = db.Projects.Find(id); if(project == null) { return HttpNotFound(); } return View(project); } – Arianit

+0

它看起来不错:) – Rudis