ASP.NET MVC重定向与模型

use*_*667 39 c# asp.net asp.net-mvc asp.net-mvc-2

我目前在我的控制器中有一个方法,它接受表单集合,保存数据,然后在"详细信息"页面中显示数据.目前,代码目前看起来像:

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

问题是以这种方式返回Details视图会保留URL mysite/Person/Create - 理想情况下我希望URL为mysite/Person/Details/IdGoesHere.

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

谢谢您的帮助.

编辑:确认 - "创建"操作生成的模型与"详细信息"操作创建的默认模型不同.因此,直接重定向到Action并传递Id不起作用,因为生成的模型不正确.为了提供更多上下文,"创建"操作中的模型包含一个附加值,表示"人员已成功创建",如果我重定向到"详细信息"操作,则此消息不会出现在模型中.

jim*_*lan 35

直接从我自己的应用程序:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,你的"细节"行动不能像这样:

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");
}
Run Code Online (Sandbox Code Playgroud)

你不能采取类似的方法??

你可以按照惯例进行重定向,并设置一个标志(如上所述在tempdata上),它会给出这个消息吗?tempadata标志只能在Create操作中设置,因此只会在创建新的'person'对象时发生.因此,"细节"操作只会在"创建"操作的结果中显示它

  • 这是要走的路.如果tempdata中的简单消息不够,您可以将整个`PersonModel`对象抛出到tempdata中,然后在`Details`动作方法中从tempdata中取回它. (3认同)

Mar*_*rko 9

这应该会带您进入Details Model,并使用它传递ID.

return RedirectToAction("Details", new { id = person.PersonID });
Run Code Online (Sandbox Code Playgroud)


Jon*_*tes 9

您可以使用提供补充(使用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);
    }
Run Code Online (Sandbox Code Playgroud)

我将此用于我可能不希望在后续请求中再次创建的项目,或者尚未在数据库中保留的项目.有了这个,我不需要在我的视图中进行空检查,因为如果有数据,则只能"获取"确认页面.


Yan*_*nis 8

请注意,您也可以采用MvcContrib的类型安全方法

return this.RedirectToAction<MyController>(c => c.Details(person.PersonID));
Run Code Online (Sandbox Code Playgroud)