我正在查看以下jQuery调用:
$.get('/Home/GetResult', null, function (data) {
alert(data);
});
与以下相比,我认为这被称为“硬编码”方式:
$.get('@Url.Action("GetResult", "Home")', function (data) {
alert(data);
});
我认为这是非硬编码的方式。
有人可以向我解释一下这是什么意思吗?在我看来,两种方式都是同样硬编码的方式来调用它,因为你在两者中都有显式的Controller和Method名称。
有谁知道为什么一个被称为硬编码而另一个不被称为硬编码。一个更好吗?
答案 0 :(得分:5)
如果我们对URL进行硬编码,那么我们将失去以后更改路由方案的能力。所以始终使用URL Helper方法。如果您使用URL帮助程序,Helper方法将负责更改,您无需在100个位置进行更改。另外,当从主页和内页调用相同的方法时,您不必担心有多少../我必须添加为前缀
通过Darin查看这些答案
答案 1 :(得分:4)
“/ Home / GetResult”被认为是“硬编码”,因为开发人员直接在代码中输入了配置值,将来更难以改变。
特别是硬编码URL值更糟糕,因为如果将此视图(和关联的控制器操作)移动到应用程序中的另一个“区域”,“/ Home / GetResult”将会中断。 @ Url.Action方法更好,因为不会。
答案 2 :(得分:2)
我喜欢Peter J 's answer。另外
您应该将URL作为href的一部分或作为html元素的属性。
E.g <a data-getresult="@Url.Action("GetResult", "Home")">click</a>
然后
var clickAction = $(this).attr('data-getresult');
$.get(clickAction, null, function (data) {
alert(data);
});
在函数中包含上述内容,并通过attrib名称将其链接到click事件。
答案 3 :(得分:1)
简单地回答你的问题,是的,我认为你列出的两个例子都是“硬编码”。第二个, @ Url.Action很难编码。它隐含的特异性较低。如果您更改了项目的根目录,第二个仍然可以正常工作,而第一个会因为@Peter J所提到的而破坏。另外,我认为如果您使用区域并更改了区域名称,第二个将起作用,而第一个会破裂。
但是,为了更有帮助,我使用第三种方法。我一个月前就已经提出了你的问题,感谢ASP.NET MVC AJAX calls without static Controller URLs (magic strings)我有一个对我来说非常好的过程。
<强> Index.cshtml 强>
<input data-action='@Url.Action(Mvc.AutoComplete.PostalCode())' type='text' name='postalCode' class='autoComplete'><input>
<input data-action='@Url.Action(Mvc.AutoComplete.ProductCategory())' type='text' name='productCategory' class='autoComplete'><input>
<强> main.js 强>
$('input.autoComplete').each(function () {
var el = $(this);
el.autocomplete({source: el.data('action')});
});
瞧!通过T4MVC和HTML5数据属性进行编译时检查和明确责任分离。从使用它的小部件中读取控制器定义。非常适合在页面上多次出现的部分视图。
我强烈推荐使用T4MVC,即“Mvc”。您在示例视图中看到的语法。如果你试图避免“硬编码”,那就像你可以获得的那样充满活力。我使用T4MVC(http://t4mvc.codeplex.com/),所以我可以避免“魔术字符串”在我的视图中引用控制器和动作。 T4MVC并不完美,但它是一个很大的改进。在隐藏的T4MVC文件中,仍然存在硬编码值,但您永远不会看到它们,它们会从您的控制器自动生成,并进行编译时检查。
此外,正如@Valamas已经提到的那样,然后我使用HTML元素上的数据属性将这些URL从我的视图传递到javascript。
当我在页面上进行AJAX调用时,我特别使用这种数据属性方法。单个页面可能很容易产生10个URL依赖关系,并且很难判断链接是否被用户测试打破,而用户测试可能没有完全覆盖条件功能。但是,万岁!当链接不存在时,T4MVC抛出编译时错误,如果您的代码在init中进行了所有数据属性检查,则javascript会在缺少相应的数据属性时抛出加载时错误(而不是运行时错误)你会得到未定义的变量)。这提供了更早/更容易检测链接缺陷,即使您没有对您的javascript进行单元测试(我也没有)。
我通常在每个页面上都有一个标准标题,其中包含当前全局有用的信息(例如,UserId)作为BODY元素上的数据属性,或者显示在:无具有已知ID的SPAN。
然后,我通常会在我的javascript代码(或者需要它的每个javascript文件)附近的单个位置加载属性中的所有数据。
这有什么好处?现在,您只需一个地方即可确保为您的javascript提供所需的所有嵌入数据参数。您的javascript不引用未定义的变量,因此如果您使用javascript IDE,则不会出现错误错误。看着你的javascript的开发人员不要试图在其他javascript文件中找到mystery变量的声明;当他们不是ASP.NET MVC开发人员时尤其麻烦。在这方面,如果你有单独的语言团队,实现职责更清楚(你的javascript开发人员在更改命名约定时不会编辑你的视图,或者相反)。此外,变量是在客户端页面生命周期的众所周知的时间点定义的,这对于调试javascript是一个很大的好处。并且您的视图不包含遍布整个页面的javascript,其中一个较小的中间页面HTML缺陷可能会意外地导致完整的javascript失败。
此外,如示例所示,这是飞行可能在页面上多次出现的部分视图的唯一方法。您可以清楚地将嵌入数据与使用它的单个HTML小部件相关联。如果您直接将javascript插入视图,则会错误地重新定义变量。
福利清单一直在继续,但基本上归结为责任分离。其他一切都来自于此。
答案 4 :(得分:0)
他们会实现同样的目标,最的时间。
基本上,如果您有一个没有区域的简单MVC站点,并且您使用的是默认路由定义,则不会发现太多变化。但是,如果您自定义路线定义或使用应用中的区域,则可能会遇到问题。在可能的情况下,建议您使用软编码方法。如果您需要将URL嵌入JavaScript文件中,则会出现问题。但是在这种情况下,它通常会指出您的实现存在问题,并且JS文件中的代码应该接受它将用作参数的URL,而不是将其嵌入到外部JS文件中。