繁体   English   中英

带有模型的 ASP.NET MVC 重定向

[英]ASP.NET MVC Redirect with model

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

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

问题是以这种方式返回详细信息视图会保留 URL mysite/Person/Create - 理想情况下,我希望 URL 为 mysite/Person/Details/{PersonId}。

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

谢谢您的帮助。

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

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

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");
}

你不能采用类似的方法吗?

您可以按照惯例进行重定向并设置一个标志(在上面的临时数据上)来提供此消息? tempadata 标志只会在 Create 操作中设置,因此只会在创建新的“person”对象时发生。 因此,Details 操作只会将其显示为 Create 操作的结果

这应该将您带到详细信息模型,并通过它传递 ID。

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

您可以使用TempData补充提供的内容(使用RedirectToAction和路由)

[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);
    }

我将它用于我可能不想在后续请求中再次创建或尚未保留在数据库中的项目。 有了这个,我不需要在我的视图中进行空检查,因为只有在有数据时才能“获取”确认页面。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM