【发布时间】: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 个潜在的解决方案,但都有缺点:
-
使用 jQuery + 2 控制器操作:1) 发回成功/失败消息,如果成功,客户端代码将 2) 使用 Ajax 调用 Customers/List 并刷新 #CustomerList。
专业人士:直截了当。容易明白。可以重用已经存在的 Customers/List 控制器操作。
Con:需要对服务器进行 2 次调用。在这一点上,性能不是问题,但在过去,我曾在没有考虑过调用次数的地方工作,它逐渐成为一个你无法轻易退出的问题。
- 使用 jQuery + 1 控制器动作。返回一个 JsonResult,其中包括 1)成功/失败和 2)#CustomersList 的刷新结果。
专业人士:1 次服务电话。
缺点:复杂性。 #CustomersList 最初是使用局部视图和非常简单的控制器方法创建的。返回一个 Json 结果,CustomersList.ascx 部分视图如何融入图片并不明显。
- 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