【问题标题】:In ASP.Net MVC, what is the best way to do an update from a dialog?在 ASP.Net MVC 中,从对话框进行更新的最佳方法是什么?
【发布时间】:2009-11-17 17:05:19
【问题描述】:

我正在尝试将我从未见过的 MVC 的 2 个部分组合在一起:1) Ajax 和 2) 错误处理。问题在于返回的内容和返回的位置(要更新的 div 元素)。

我有一个如下所示的 ASP.net MVC 页面

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Store>" %>

<div id="MainPage>
  <div id="Some Stuff>
    Lorem Ipsum
  </div>
  <div id="CustomerList>
    <% Html.RenderPartial("~/Views/Customers/List.ascx", Model.Customers); %>
  </div>
  <div id="dialog">
    <div id="dialogErrorMessage"></div>
  </div>
</div>

客户列表部分视图将是一个包含客户列表的表格。每条记录都有一个编辑链接,该链接将打开一个对话框,其中包含来自 Customers/Edit.ascx 部分视图的信息,如下所示:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Customer>" %>
<fieldset>
<p>
<label for="CustomerName"></label>: <%= Html.TextBox("CustomerName", Model.CustomerName)) %>
</p>
<p>
<label for="CustomerAddress"></label>: <%= Html.TextBox("CustomerAddress", Model.CustomerAddress)) %>
</p>
<p>
<input id="btnSave" type="submit" value="Save" />
</p>
</fieldset>

当点击 btnSave 时,它​​会发布到客户/编辑。如果更新成功,对话框应该关闭并且#CustomersList 应该刷新。 然而,如果更新失败,#dialog 应该保持打开状态并且#dialogErrorMessage 应该显示“更新失败,错误是等等等等……”。

这就是我卡住的地方。 ASP.Net MVC Ajax 辅助方法和 jQuery 库都可以进行 Ajax 发布并轻松替换 div,但是在大多数示例中,客户端知道哪个div 替换 before 它进行 Ajax 调用。在我的错误处理示例中,客户端不知道要更新哪个 div,直到 之后 它得知更新成功。我提出了 2 个潜在的解决方案,但都有缺点:

  1. 使用 jQuery + 2 控制器操作:1) 发回成功/失败消息,如果成功,客户端代码将 2) 使用 Ajax 调用 Customers/List 并刷新 #CustomerList。

    专业人士:直截了当。容易明白。可以重用已经存在的 Customers/List 控制器操作。

    Con:需要对服务器进行 2 次调用。在这一点上,性能不是问题,但在过去,我曾在没有考虑过调用次数的地方工作,它逐渐成为一个你无法轻易退出的问题。

  2. 使用 jQuery + 1 控制器动作。返回一个 JsonResult,其中包括 1)成功/失败和 2)#CustomersList 的刷新结果。

    专业人士:1 次服务电话。

    缺点:复杂性。 #CustomersList 最初是使用局部视图和非常简单的控制器方法创建的。返回一个 Json 结果,CustomersList.ascx 部分视图如何融入图片并不明显。

  3. ASP.Net MVC Ajax 辅助方法——我看不出这提供了一个解决方案,因为它的主要方法是使用 UpdateTargetID 更新目标。

我对 jQuery 还比较陌生,并且在做认真的 Ajax 编程。我知道这两种方法都可以,但我想知道“为什么”一种选择比另一种更好。从很多痛苦的 Javascript 编程中,我从 Douglas Crockford 和其他人那里了解到,Javascript 的编程模式与服务器端 C#、Java 等不同。

最好的方法是什么?

分辨率

在 John 的建议下,我确实研究了 jQuery 的 $.ajax 中内置的错误功能,但是我还缺少另一部分:

在控制器中,我需要放

     catch(Exception ex)
    {
        Response.StatusCode = 500;
        return Content("An Error occured.");
    }

最初,我选择只抛出异常。这迫使错误运行,但我真正想要的是来自服务器的自定义消息,而不是 ASP.Net 异常。

通过添加 Response.StatusCode = 500 行,它使 jQuery 了解发生了错误,但它也使我能够更好地自定义返回的内容。在这里,我只是选择发送单个通用错误消息,但在未来,我可能会使其更加健壮。

【问题讨论】:

    标签: jquery asp.net-mvc ajax dialog


    【解决方案1】:

    JQuery ajax 调用具有成功和失败的函数处理程序。如果您抛出包含失败文本的异常,则可以使用一个服务器调用。结果将是成功或失败,调用不同的处理函数,每个函数都知道在哪里显示结果以及如何从生成的 JSON 对象中获取结果。

    查看http://docs.jquery.com/Ajax/jQuery.ajax 以查看 JQuery 的 ajax() 方法的成功和错误选项的描述。 (使用错误,就像成功一样。)

    【讨论】:

      【解决方案2】:

      简单——作为 POST/Response 循环的一部分,传入一个变量,告诉 UI 更新内容的位置,例如列表的 ID 或 DIV。

      【讨论】:

        猜你喜欢
        • 2011-12-26
        • 2011-03-16
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 2015-09-01
        • 2012-04-08
        • 2011-11-10
        相关资源
        最近更新 更多