处理ASP.. NET MVC路由在外部JavaScript
Handling ASP.NET MVC Routing in External JavaScript
在JavaScript中避免硬编码URL的最佳方法是什么(主要用于进行AJAX调用时)?
过去:
- 用
@Url.Action
或@Url.RouteUrl
的结果渲染JavaScript变量 - 将
@Url.Action
或@Url.RouteUrl
的结果传递给init/tor中的JavaScript。
有更好的方法吗?
像这样做会很好:
var url = $.routes("actionName", "controllerName") // or "routeName" for named routes
$.post(url, { id = 1 }, function() { //.. });
这当然是不可能的(JavaScript不能直接访问ViewContext,因此不能访问路由表)。
但我想知道是否有一种方法,我可以设置我自己的"路由表"的JavaScript,只有那些我知道它需要?(例如,我在视图中设置它)
人们如何处理这个问题?
尽管在视图中注入了javascript,我还是宁愿让HTML做它的工作,让javascript做它的工作。格式如下:
链接
/*A cssclass=ajaxlink is added to all those links which we want to ajaxify*/
//html in view
<a class='ajaxlink' href='@Url.Action("Action","Controller")'>I am An Ajax Link</a>
//generated clean html
<a class='ajaxlink' href='/controller/action'>I am An Ajax Link</a>
//Js
jQuery('.ajaxlink').live('click',function(e){
e.preventDefault(); /*Prevent default behavior of links*/
var url= $(e.target).attr('href');
/*
Now u have url, do post or get:
then append received data in some DOM element.
*/
});
//控制器public ActionResult()
{
if(Request.IsAjax())
{
/*Return partial content*/
return View();
}
else
{
return View("SomeOther_View.cshtml");
/*
At this point you may reject this request or return full view
whatever you feel is okie.
*/
}
}
这样,两种类型的用户都可以处理javascript启用和禁用。
表单也是一样
实现一个Javascript路由引擎不会太难。首先,序列化从c#到Javascript的路由。其次,重新创建Url.Action
方法。
然而,这对我所从事的任何项目来说都有点过分了。我团队的项目总是呈现一个通用的Javascript变量,它包含所有必要的URL。这种方法确保了强类型的操作方法,也有助于更好地进行重构。
这说起来容易做起来难,但是你的网站应该在JavaScript关闭的情况下功能齐全。当实现这一点时,您应该能够在您的网站中添加AJAX支持,并在您的锚标记中重用现有的HREF属性或表单标记中的动作属性。该网站将更容易维护,因为您不需要更新JavaScript文件中的链接。
我决定使用ASP实现我自己的UrlFactory。. NET helper直接(Html/Url)在我的代码,现在我没有src与我,我将张贴他们明天。
优点:我可以很容易地跟踪每个url,并以集中的方式执行一些重写。
用法示例:
@{
string myAjaxUrl = UrlFactory.GetUrl (ActionName, ControllerName, new { query-params });
}
然后在javascript中使用
var jsUrl = '@myAjaxUrl';
一旦你定义了自己的Factory,你就可以劫持"重要的"url(例如:用于重写),并将common留给Url helper实现。
然而,要拥有这个完整的客户端,还有一个额外的步骤来渲染Js路由上下文,以访问客户端变量。
编辑:正如我所承诺的,我非常简单的Url类构建器:
public static class UrlFactory
{
public static string GetUrl(string Action, string Controller, object RouteValues)
{
UrlHelper Url = new UrlHelper(HttpContext.Current.Request.RequestContext);
return Url.Action(Action, Controller, RouteValues);
}
// Common URLS for Denied et similars.
public static string GetDeniedUrl(PEDUtenti Utente, object RouteValues)
{
return GetUrl(Utente, "Denied", "Errors", RouteValues);
}
public static string GetDeniedUrl(object RouteValues)
{
return GetUrl("Denied", "Errors", RouteValues);
}
}
- 使用html中的外部javascript进行数据验证
- 将变量传递给外部Javascript
- 关于引入外部javascript文件的问题&css通过https
- 有没有办法在tinymceiframe中加载一个外部javascript文件
- 如何在MVC5中ajax调用的部分视图中引用外部javascript
- HTML外部javascript加载另一个javascript
- 如何在定义js文件后为外部javascript文件设置变量
- ResolveUrl没有'我似乎不适合当链接到具有动态虚拟目录的外部javascript文件时
- 如何在小部件中添加外部javascript库和样式表
- 外部JavaScript验证不起作用
- Chrome扩展无法通过清单加载外部javascript
- 动态虚拟目录和外部 JavaScript 链接
- Web 地址虚拟目录会断开外部 JavaScript 链接,因此找不到文件
- 如何从窗体调用外部javascript方法
- 如何使用外部Javascript库(如jQuery)重命名Google闭包样式表
- 如何使用Java在WebDriver中调用外部JavaScript
- 从Haml调用外部javascript中的ruby数组
- 在选择更改时更改从外部javascript生成的flash播放器
- 缓存javascript失败,因为使用了外部javascript
- 在AngularJS中手动加载和卸载外部javascript