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'对象时发生.因此,"细节"操作只会在"创建"操作的结果中显示它
这应该会带您进入Details Model,并使用它传递ID.
return RedirectToAction("Details", new { id = person.PersonID });
Run Code Online (Sandbox Code Playgroud)
您可以使用提供补充(使用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)
我将此用于我可能不希望在后续请求中再次创建的项目,或者尚未在数据库中保留的项目.有了这个,我不需要在我的视图中进行空检查,因为如果有数据,则只能"获取"确认页面.
请注意,您也可以采用MvcContrib的类型安全方法
return this.RedirectToAction<MyController>(c => c.Details(person.PersonID));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
67130 次 |
最近记录: |