我正在进行ajax“发布”操作,我需要找出行动的网址。
为此我正在使用
var url = '<%= Url.Action("Action", "Controller") %>';
但是这段代码存在于一个相当大的Js文件中,该文件正在加载到我的MVC视图中。我不想将它全部移到我的视野中,因为它太大而且看起来一团糟。
我尝试将我的JS include设置为runat =“server”但这个错误。
<script runat="server" src="<%: ResolveUrl("~/Scripts/Custom/MyScript.js")%>" type="text/javascript" ></script>
可以这样做吗?
谢谢, 钢钣
答案 0 :(得分:5)
不,你不能把ASP.NET放在一个javascript文件中。 Javascript文件是静态资源,应由Web服务器直接提供。它们永远不应包含任何服务器端语言。您可以在视图中将url
定义为全局变量:
<script type="text/javascript">
var url = '<%= Url.Action("Action", "Controller") %>';
</script>
然后在您的javascript文件中使用此url
变量。
请注意,根据您对此变量所做的操作,可能会有更好的方法。例如,假设您在视图中有一个想要ajaxify的锚点:
<%: Html.ActionLink("some text", "actionName", new { id = "fooAnchor" }) %>
然后在你的javascript中你可以:
$(function() {
$('#fooAnchor').click(function() {
$('#result').load(this.href);
return false;
});
});
因此根本不需要声明任何变量。另一种选择是定义一个带有参数的javascript函数,以便您可以根据需要传递它。
结论:将您的javascript文件视为可重用的组件,明天您可以插入基于Java Servlets的酷站点并将其托管在CDN上。你甚至可以尝试将它们转换为reusable jQuery plugins。不要试图将它与服务器端语言混合,因为它会导致强大的耦合,丑陋的代码 - 标记汤。
答案 1 :(得分:1)
我最近使用的另一种方法是创建一个包含操作的对象: -
<script type="text/javascript">
Actions = {
Create: "<%= Url.Action("Create") %>",
Edit: "<%= Url.Action("Edit") %>",
GetGridData: "<%= Url.Action("GetGridData") %>"
};
</script>
然后在Javascript中使用它: -
$(celDiv).html("<a href=" + Actions.Edit + "/" + id + ">" + $(celDiv).text() + "</a>");
这很好用,因为这些动作都包含在一个地方。
答案 2 :(得分:1)
是的,你可以,但你可能不想这样做。
完全有可能让asp.net管道处理js文件的请求,它只是在IIS中设置关联的一种情况。然而,它会用智能感知器发挥作用,并且可能会不必要地混淆。
对于ajax帖子,我找到的最好的方法是用适当的action属性集写出表单。然后使用JS读取此属性。这样,如果您更改表单的操作,JS也会更新。这也符合js为您的页面添加功能而不是完全定义它们的想法。