最新的 Asp.Net MVC RC 允许返回 JavaScript ActionResult。
我想从控制器动态生成 Jquery 脚本代码,以执行对控制器的经典 $.ajax 调用,以在 ajax 中创建读取更新删除操作,而不是经典的获取/发布表单操作。我应该在设计时(就像现在使用 T4 模板)还是在运行时生成 javascript 代码?
我知道这会打破视图和控制器的清晰分离,但有更好的方法吗?
2 回答
在我看来,这是一种返回 javascript 操作结果的糟糕技术。当您对 html 元素使用内联样式时,您会收到代码混乱。为什么不将 js 写在单独的文件中并将其包含在页面中?为了在您的 ajax 调用后执行一些操作,您可以轻松地使用回调。如果您需要指定需要更新或删除的元素或其他内容,您可以使用 JsonResult 和 $.getJSON 或 $.post(url, data, callback, 'json')。为了 ajaxify 你的表单,你可以使用 jquery.form 插件。另请查看 jquery.jframe 插件,它提供了根据请求响应更新一些其他元素的功能。
大多数时候,当我创建一个返回 JsonResult 的控制器方法时,我最终会编写相同的样板 javascript 代码来访问它,我已经编写了数十次(可能是数百次)但使用不同的参数和传入的回调函数。我一直认为这是代码生成的绝佳机会。我仍在研究这个,但这里有一些我遇到的资源:
- Steve Sanderson 的一篇博客文章探讨了如何使用 T4 搭建一个 AJAX 网格控制器,其中包括一些生成的连接网格的 javascript。http://blog.stevensanderson.com/2011/04/08/mvcscaffolding-scaffolding-custom-collections-of-files/
Jayrock (http://jayrock.berlios.de/) 是一个 JSON RPC 框架,可帮助您创建返回 JSON 的服务并生成它自己的代理 javascript 类,这些代理 javascript 类处理 ajax 编码以对服务器进行同步和异步调用。来自项目站点的示例:
var s = new HelloWorld();
alert("sync:" + s.greetings());
s.greetings(function(response) { alert("async:" + response.result) });
此外,它还会生成类似于 .NET Web 服务所做的测试页面。我过去使用过这个库,发现它很有效。虽然我喜欢继续将相关代码保留在控制器中的想法,但为了方便起见,我可能会回到这一点,这样我就可以将更多时间花在计算机无法生成的代码上。
- 最后,Phil Haack 谈到了我们在这里谈论的事情(我还没有尝试过),http://haacked.com/archive/2011/08/18/calling-asp-net-mvc-action -methods-from-javascript.aspx