【问题标题】:ASP .NET MVC - How to redirect a user control to the view its called from?ASP .NET MVC - 如何将用户控件重定向到调用它的视图?
【发布时间】:2012-03-04 04:23:16
【问题描述】:

我有一个在数据库中创建新记录的用户控件。在它创建新记录之后,我想将它重定向回它的视图。这样做的目的是刷新视图,以便它可以显示新创建的记录。问题是用户控件可以存在于多个视图中,那么我如何知道用户控件来自哪个视图?这样我就可以实现上述场景?谢谢,

温迪

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2


    【解决方案1】:

    我有一个在数据库中创建新记录的用户控件。

    不,它没有。它只呈现 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 视图应该负责设置表单,而不是用户控件。

    【讨论】:

    • 正如我所提到的,这个表单可以放置在多个视图中。不在用户控件(部分视图)中实现它不是一个糟糕的编程习惯吗?如果我将此表单放在 5 个视图中,而不使用用户控件,那么每当我进行更改时,我必须在 5 个不同的地方进行。因此使用用户控制/部分视图。
    • @RWendi - 查看我的编辑。您只需将Html.BeginForm 声明放在每个视图上。实际表单的标记放置在编辑器模板中(1 个位置)。 IMO 意见,视图应该设置表单,而不是用户控件。
    • 你是说如果我想要两个不同视图中的表单(例如主索引视图和产品索引视图),我必须为每个视图设置两个表单(主索引视图中的一个表单,并且产品索引视图中的另一个)? EditorTemplates 也必须放在两个文件夹的根目录中。如果我想更改表单的外观,我也需要在两个地方都这样做。也许我在这里遗漏了一些东西。
    • @RWendi - 你在使用区域吗?如果是这样,并且您的视图位于 2 个不同的区域,则将编辑器模板放在根 /Shared/EditorTemplates 文件夹中,您只需更改一个位置。所以,是的,你错过了一些东西。 :)
    【解决方案2】:

    有几种方法,

    1) 您可以使用 this.Request.UrlReferrer.AbsoluteUri ,它将始终为您提供页面的 Url。

    2) 或者,您可以在 PartialView 的 ... 中拥有一个隐藏属性,该属性将保存当前 url 的值。 (@this.ViewContext.ParentActionViewContext.HttpContext.Request.UrlReferrer.AbsoluteUri) 但前提是您使用的是@Html.RenderAction。

    在子操作中,您可以重定向到上述任一网址。 (第一种方法要好得多,适用于所有场景)

    【讨论】:

      【解决方案3】:

      我认为刷新是呈现用户控件所在视图的操作的责任。

      您可以在场景(或视图)中在一个操作中完成插入,然后将请求传递给显示新创建记录的另一个操作(可能是列表)。

      或者您可以在其他情况下插入只是您想要保存到数据库的一部分并且刷新原始视图可能会导致数据丢失。

      也许我所说的不是你的项目现在发生的事情,而是你应该在赋予用户控制权之前考虑的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多