8

在你回答之前,这个问题很复杂:

  1. 我们正在 asp.net / asp.net mvc / jQuery 中开发,但我对使用任何框架的任何平台上的解决方案持开放态度
  2. 我认为排序/隐藏列/重新排列列/验证(有意义的地方)之类的逻辑应该在客户端
  3. 我认为像搜索/更新数据库/运行工作流这样的逻辑应该在服务器端(只是因为安全/调试原因)

我们要做的不是通过编写一堆 JavaScript 来处理不同上下文中的相同功能,从而在我们的 UI 中造成混乱。我知道我可以使用 JavaScript 文件 + 面向对象的 JavaScript,我正在寻找使这一切变得更容易的模式。

提出的一种解决方案是在客户端和服务器端都有一个 MVC 模型,我们可以在客户端控制器中封装 JavaScript 功能,然后在站点的不同部分使用它们。但是,这意味着我们有 2 个 MVC 实现!

这是矫枉过正吗?您将如何扩展此解决方案?还有哪些其他解决方案?

4

6 回答 6

3

我只是在谷歌上搜索了这个,所以把它带上一粒盐。 JavascriptMVC声称是一个 MVC 框架。同样,我没有这方面的经验,但它可能值得一看。

于 2008-10-18T11:51:23.427 回答
3

把事情简单化。构建您的应用程序以在 MVC ASP.Net 框架中完全发挥作用。在这个测试阶段不需要 JavaScript。

现在,通过在您的 site.master(Google 链接)中链接 jQuery 并在需要 Web 2.0 体验的视图底部添加好东西,链接到适当的 JS 文件,以不显眼地添加功能。关闭 JS,您的应用会降级到上一步。

例如,除了服务器端之外,您还想添加客户端验证。JS 文件会将事件处理程序附加到 onsubmit 表单。然后,处理程序将使用由服务器生成的对象(用于服务器验证的同一对象),该对象最好作为 JSON 对象,因为它与 JS 和 ASP.NET 兼容。该对象的成员将是要检查的规则和要在您选择服务器端错误的同一位置写入 DOM 的错误消息。您的处理程序返回 false 直到所有内容都有效并且正确时返回 true。

您想要一个漂亮的花哨功能,例如图片的灯箱视图。为您的视图添加插件,修改标记<ul id="lightup">...,添加代码:

$(函数(){
   $(#lightup).showit(400); // 或类似的东西
});

和你的好去。

尝试将共享功能从您的服务器代码中分离到 Web 服务或页面中,以便客户端通过 XHR 和服务器可以共享相同的功能/数据。

于 2009-03-11T17:26:53.487 回答
2

两个;您应该始终进行服务器端验证和客户端验证

三;如果您能找到一种在客户端操作数据库的方法,那将是令人印象深刻的;)

我不知道 ASP.net 是如何工作的,所以我只是从我的 PHP 经验中说。

我会编写由服务器和客户端代码配对的控件。每个控件都需要一个表单、客户端逻辑和服务器端逻辑。表单由模板引擎写出,客户端逻辑附加到表单并用 JS 编写,服务器端逻辑是操纵模型的控制器/动作对。显然,您不想将客户端逻辑耦合到特定的操作/控制器,因此请务必定义一个可用于与您的控件对话的接口......

然后对于每个表单,我会在 javascript 中编写一个类来实例化您的控件。例如; 你可能有一个控制:

{include file = "list_view.php" id = "ListView1" data = $Data.List}

这会将您的表格打印出来。然后在您的页面控制器类中:

this.ListView1 = new ListViewController({id : "ListView1", serverCtrl : "Users"});

现在您可以使用“this.ListView1”来操作列表视图。如果用户按下下一页按钮,列表视图控制器会执行诸如对新页面进行 AJAX 查询的操作 - 并且还处理列和排序(这也将委托给服务器)。

于 2008-10-17T19:22:37.540 回答
1

如果您使用的是 MVC,那么我假设您的视图使用模板引擎。每个页面都与一个模板相关联,每个模板通常包含对一个或多个脚本的引用。问题是,您的脚本是如何在模板中引用的?它们是静态的,还是动态的?在您的控制器中,您应该可以选择在用于页面的视图中包含任何脚本,而不管模板如何。我经常建议这种“在需要时包含它”的方法,因为模拟 MVC 客户端正是您所说的意思——您现在有两个 MVC 框架需要维护。不仅如此——对于大多数客户端模型,它们可以直接访问您的服务器端模型,这违背了您的服务器端 MVC 的目的。您现在完全绕过了控制器。

当涉及到 JavaScript 时,最好的办法就是保持它非常简单。使用 jQuery,您有更好的机会实现这一目标。每个页面都有核心,在同一个文件夹中还有几个其他的 JavaScript 文件,每个都是映射到非常特定功能的 jQuery 对象的插件或扩展。如果开发人员想知道功能是否已经存在,您只需检查 JavaScript 文件所在的文件系统。如果插件存在,请将其包含在您的控制器中以在页面中使用。通过这种方式,您可以在位于客户端应用程序和任何现有控制器之间的服务器端构建助手。帮助程序特定于该功能和插件,并且您不会从客户端打开对模型的全面访问。

于 2008-10-19T22:57:50.163 回答
1

不要将 json/xml 返回到视图并在客户端使用 jquery dom 生成来构建它们。在体面的机器上性能不错,但我犯了这个错误,当我试图用我的 iphone 查看网站时,加载需要 60 秒......而且我是网站上唯一的人!:-)

所以此时我只是使用 jquery dom 注入来进行 ajaxy 更新,而不是渲染整个页面。

于 2009-08-11T15:42:12.013 回答
-1

... 这取决于...

实际上最好的事情是使用 css / javascript / html 为样式 / 行为 / 结构 + 数据开发 UI,现在人们想要 ajax 交互(他们到处都能看到很酷的东西,所以他们期望他们不必每次重新加载整个页面)所以我认为你应该考虑到这一点。BTW MVC 在您的内容被提供时结束,并且它不必是HTML 内容,您可以在视图中提供 xml 或 json。

ASP.NET MVC 允许返回 Content("TEXT") 以便您可以使用 MVC 和 javascript 中的用户交互/行为来组织后端,例如,当向服务器发送 ajax 调用时,您正在调用应用程序的控制器部分,因此您可以调用一个 Ajax 操作来切换到呈现为 JSON 并返回到 UI 的 JS 部分(行为部分)的 ajax 模型。

由于行为部分是在您的视图部分中定义的(初始视图由 CSS / HTML JS 组成),所以只要是表示部分,我认为您没有破坏 MVC 模式。

PS。我忘了说显然数据库操作保留在您的模型中(您可以将模型视为数据访问层 + 业务对象层所在的位置)

于 2008-10-17T19:24:54.977 回答