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