【发布时间】:2012-03-04 04:23:16
【问题描述】:
我有一个在数据库中创建新记录的用户控件。在它创建新记录之后,我想将它重定向回它的视图。这样做的目的是刷新视图,以便它可以显示新创建的记录。问题是用户控件可以存在于多个视图中,那么我如何知道用户控件来自哪个视图?这样我就可以实现上述场景?谢谢,
温迪
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2
我有一个在数据库中创建新记录的用户控件。在它创建新记录之后,我想将它重定向回它的视图。这样做的目的是刷新视图,以便它可以显示新创建的记录。问题是用户控件可以存在于多个视图中,那么我如何知道用户控件来自哪个视图?这样我就可以实现上述场景?谢谢,
温迪
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2
我有一个在数据库中创建新记录的用户控件。
不,它没有。它只呈现 HTML,没有别的。
这是在数据库中创建新记录的控制器操作,因此这是重定向应该发生的地方。
接受模型/表单的[HttpPost]动作应该在保存完成后执行重定向。
例如:
public ActionResult Save(SomeModel model)
{
db.Save(model);
return RedirectToAction("Index");
}
我假设您要刷新的“视图”是同一个页面,无论用户控制器在哪个页面上呈现,因此上面的代码很好。
附带说明,您不应该使用用户控件(例如部分控件)来呈现表单。
您应该使用编辑器模板。呈现表单(并指定要发布到哪个操作)的演示代码应该在视图中,而不是在用户控件中。
编辑 - 如何在视图上呈现表单的示例:
而不是在视图上这样做:
@Html.Partial("_SomeModel")
这样做:
@using (Html.BeginForm()) {
@Html.EditorFor(model => model.SomeModel)
}
并将表单标记放置在编辑器模板中。这里的关键是 IMO 视图应该负责设置表单,而不是用户控件。
【讨论】:
Html.BeginForm 声明放在每个视图上。实际表单的标记放置在编辑器模板中(1 个位置)。 IMO 意见,视图应该设置表单,而不是用户控件。
有几种方法,
1) 您可以使用 this.Request.UrlReferrer.AbsoluteUri ,它将始终为您提供页面的 Url。
2) 或者,您可以在 PartialView 的 ... 中拥有一个隐藏属性,该属性将保存当前 url 的值。 (@this.ViewContext.ParentActionViewContext.HttpContext.Request.UrlReferrer.AbsoluteUri)
但前提是您使用的是@Html.RenderAction。
在子操作中,您可以重定向到上述任一网址。 (第一种方法要好得多,适用于所有场景)
【讨论】:
我认为刷新是呈现用户控件所在视图的操作的责任。
您可以在场景(或视图)中在一个操作中完成插入,然后将请求传递给显示新创建记录的另一个操作(可能是列表)。
或者您可以在其他情况下插入只是您想要保存到数据库的一部分并且刷新原始视图可能会导致数据丢失。
也许我所说的不是你的项目现在发生的事情,而是你应该在赋予用户控制权之前考虑的事情。
【讨论】: