C# 带模型的ASP.NET MVC重定向

C# 带模型的ASP.NET MVC重定向,c#,asp.net,asp.net-mvc,asp.net-mvc-2,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 2,我目前在控制器中有一个方法,它接受表单集合,保存数据,然后在“详细信息”页面中显示数据。目前,代码看起来像: [HttpPost] public ActionResult Create(PersonModel person) { if (person.IsValid()) { person.additionalData = "Person created successfully"; return View("Deta

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

[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的模型

谢谢你的帮助


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

这将带您转到Details模型,并将ID与之一起传递

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

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

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标志只会在创建操作中设置,因此只会在创建新的“person”对象时发生。因此,细节操作只能作为创建操作的结果来显示它。请注意,您也可以采用MvcContrib的类型安全方法并执行

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

您可以使用
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);
    }
[HttpPost]
公共虚拟操作结果创建(IEnumerable orderItems)
{
if(orderItems.Count()==0)
{
返回重定向到操作(“NoOrderItems”);
}
其他的
{
TempData[“orderItems”]=orderItems;
返回重定向到操作(“确认”);
}
}
[HttpGet]
公共虚拟操作结果确认()
{
var orderItems=TempData[“orderItems”]作为IEnumerable;
if(orderItems==null | | orderItems.Count()==0)
{
调用ehttp404(ControllerContext.HttpContext);
}
返回视图(orderItems);
}

我使用它来处理我可能不想在后续请求中再次创建的项目,或者在数据库中仍然保留的项目。这样,我的视图中就不需要空检查,因为确认页面只有在有数据的情况下才能“获取”。

Hi,问题在于默认操作不会像通过“创建”操作一样使用相同的数据填充模型。看看其他答案,最好的解决方案似乎是TempData。你可以创建一个InitializeModel方法,它可以为你完成所有的数据分配魔术。这就是方法。如果tempdata中的一条简单消息还不够,您可以将整个
PersonModel
对象扔到tempdata中,然后在
Details
action方法中从tempdata取回它。如果您不想要MvcContrib的全部功能,你可以在伟大的代码中使用MvcNavigationHelpers我还没有测试过它,但很快就要处理这样的组件,我有一个问题,如果我刷新页面,它会工作吗,或者tempdata会过期