2010-10-25 101 views
33

我目前在我的控制器中有一个方法,它接受一个表单集合,保存数据,然后将数据显示在“详细信息”页面中。目前,该代码目前看起来是这样的:ASP.NET MVC重定向模型

[HttpPost] 
public ActionResult Create(PersonModel person)<br> 
{ 
    if (person.IsValid()) 
    { 
     person.additionalData = "Person created successfully"; 
     return View("Details", person); 
    } 
} 

的问题是,在返回的详细信息以这种方式查看保留URL的mysite /人/制作 - 我非常希望的URL是mysite的/人/详细资料/ IdGoesHere。

我确定这一定是可能的。显然,我可以使用Response.Redirect,但是这不允许我将模型传递给视图。据我所知,我无法使用RedirectToAction传递模型?

感谢您的帮助。

编辑:确认 - 由创建操作生成的模型不同于由详细信息操作创建的默认模型。因此,直接重定向到Action并传递Id不起作用,因为产生的模型不正确。为了提供更多上下文,创建操作中的模型包含一个附加值,说明“人员已成功创建”,如果我重定向到“详细信息”操作,则此消息不存在于模型中。

回答

29

user460667,

直接从自己的应用程序:

public ActionResult Create(Booking item) 
{ 
    if (ModelState.IsValid) 
    { 
     int newID = _tasks.Create(item); 
     // NEW section to emulate model being populated for use in Details view 
     TempData["additionalData"] = "Person created successfully"; 
     return RedirectToAction("Details", new { id = newID }); 
    } 
    else 
    { 
     return View(); 
    } 
} 

然后,无法将您的详细操作是这样的:

public ActionResult Details(int id) 
{ 
    var item = _tasks.GetByKey(id); 
    var additionalData = TempData["additionalData"]; 
    if(item != null) { 
     if(additonalMessage!=null) 
     { 
      item.additionalData = additionalData; 
     } 
     return View(item); 
    } 
    else 
     return View("Notfound"); 
} 

不能你采纳一个类似的方法??

[编辑]

用户,重新您编辑。你能不能按照惯例做重定向,并且有一个标记(在上面的tempdata上)给出这个消息? tempadata标志只会在Create操作中设置,因此只会在创建一个新的'person'对象时发生。因此,详细的行动将永远只能表明它作为创建行动的后果

+3

这是要走的路。如果tempdata中的简单消息不够用,您可以将整个'PersonModel'对象放入tempdata中,并将其从'Details'操作方法中的tempdata中取回。 – Charlino 2010-10-25 20:07:35

6

这应该带你到详细模型,传递它的ID。

return RedirectToAction("Details", new { id = person.PersonID }); 
+0

嗨,这个问题是,默认的行动不会使用相同的数据填充模型,就好像它通过'创建'行动。看其他答案,最好的解决方案似乎是TempData。 – user460667 2010-10-25 12:12:53

+1

您可以创建一个InitializeModel方法,为您分配所有的数据。 – 2010-10-25 12:18:19

6

记住,您还可以采取MvcContrib的类型安全的方法,并做

return this.RedirectToAction<MyController>(c => c.Details(person.PersonID)); 
+0

如果你不想要MvcContrib的全部功能,你可以在https://github.com/uglybugger/MvcNavigationHelpers使用MvcNavigationHelpers – 2017-03-04 04:07:17

8

您可以补充什么已经提供(使用RedirectToAction和路由)配合使用的TempData

[HttpPost] 
public virtual ActionResult Create(IEnumerable<OrderItem> orderItems) 
    { 
     if (orderItems.Count() == 0) 
     { 
      return RedirectToAction("NoOrderItems"); 
     } 
     else 
     { 
      TempData["orderItems"] = orderItems; 
      return RedirectToAction("Confirm"); 
     } 
    } 

    [HttpGet] 
    public virtual ActionResult Confirm() 
    { 
     var orderItems = TempData["orderItems"] as IEnumerable<OrderItem>; 
     if (orderItems == null || orderItems.Count() == 0) 
     { 
      this.InvokeHttp404(ControllerContext.HttpContext); 
     } 

     return View(orderItems); 
    } 

我用这个,我可能不希望在后续请求中重新创建或在数据库中持续相当,但还没有项目。有了这个,我不需要在我的视图中进行空检查,因为确认页面只有在有数据时才能“获得”。

+0

伟大的代码我还没有测试过它,但很快就必须在这样的组件上工作,我有一个问题,如果我刷新页面,它会工作或tempdata将过期 – 2017-07-25 04:57:25