在ASP.Net MVC中,从对话框进行更新的最佳方法是什么?

我正在尝试将我未曾见过的两部分MVC结合起来:1)Ajax和2)error handling。 问题在于返回的内容以及返回的where(要更新的div元素)。

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

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

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

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 

:

:

单击btnSave时,它将向Customers / Edit发送一个post。 如果更新成功,则应关闭对话框并刷新#CustomersList。 但是 ,如果更新失败,则#dialog应保持打开状态,并且#dialogErrorMessage应显示“更新失败,错误是等等,等等……”。

这就是我被困住的地方。 ASP.Net MVC Ajax辅助方法和jQuery库都可以做一个Ajaxpost并轻松替换div,但是在大多数示例中,客户端在进行 Ajax调用之前知道要替换哪个div。 在我的error handling示例的情况下,客户端得知更新成功之后才知道要更新哪个div。 我想出了两个可能的解决方案,但两者都有缺点:

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

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

    Con:需要2次调用服务器。 在这一点上,性能不是一个问题,但在过去,我曾经在没有考虑过呼叫次数的地方工作,并且它逐渐陷入困境,这是一个你不能轻易退出的问题。

  2. 使用jQuery + 1控制器操作。 返回包含1)成功/失败和2)#CustomersList的刷新结果的JsonResult。

    专业:1次服务电话。

    骗局:复杂性。 #CustomersList最初是使用局部视图和非常简单的控制器方法创建的。 返回Json结果,很明显CustomersList.ascx局部视图如何适应图片。

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

我仍然是jQuery的新手,并且正在进行严肃的Ajax编程。 我知道两种方式都可行,但我想知道“为什么”一种选择比其他选择更好。 从很多痛苦的Javascript编程中,我从Douglas Crockford和其他人那里了解到,Javascript中的编程模式与服务器端C#,Java等不同。

什么是最好的方法?

解析度

在John的推荐下,我确实研究了jQuery的$ .ajax中内置的错误function,但是还有另外一件我错过了:

在控制器中,我需要放

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

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

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

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

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

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