在JavaScript中为ASP.NET MVC生成操作URL

时间:2010-01-06 11:39:34

标签: asp.net javascript asp.net-mvc

我正在尝试通过使用特定参数调用控制器中的操作来重定向到另一个页面。我正在尝试使用这一行:

window.open('<%= Url.Action("Report", "Survey",
    new { id = ' + selectedRow + ' } ) %>');

但我无法使它发挥作用;它给出了以下错误:

  

CS1012: Too many characters in character literal.

我无法生成客户端的操作URL吗?或者我是否必须通过提供参数并获取所需的URL来进行Ajax调用?这似乎不对,但我想,如果这是唯一的方法。

有更简单的解决方案吗?

9 个答案:

答案 0 :(得分:53)

请记住&lt;%和%&gt;之间的所有内容被解释为C#代码,所以你实际上正在尝试评估C#的以下行:

Url.Action("Report", "Survey", new { id = ' + selectedRow + ' } )

C#认为单引号围绕着一个字符文字,因此你得到的错误信息(字符文字在C#中只能包含一个字符)

也许您可以在页面脚本中生成一次URL - 在页面HEAD的某处,执行此操作:

var actionUrl =
    '<%= Url.Action("Report", "Survey", new { id = "PLACEHOLDER" } ) %>';

那将为您提供一个包含您需要的URL的Javascript字符串,但是使用PLACEHOLDER而不是数字。然后将您的点击处理程序设置为:

window.open(actionUrl.replace('PLACEHOLDER', selectedRow));

即。当处理程序运行时,您会在预先计算的URL中找到PLACEHOLDER值,并将其替换为所选行。

答案 1 :(得分:9)

我通常在该部分声明一个javascript变量来保存我网站的根目录。

<%="<script type=\"text/javascript\">var rootPath = '"
    + Url.Content("~/") + "';</script>" %>

为了解决您的问题,我只想做

window.open(rootPath + "report/survey/" + selectedRow);

答案 2 :(得分:3)

你可以吗

window.open('/report/survey/' + selectedRow);

相反,我选择的行是id?路由选择应该很好。

或使用getJSON

也许您可以使用JSONResult。 window.open应该在哪里调用方法,即OpenSurveyWindow(id);

然后添加一些类似于下面的jquery

function OpenSurveyWindow(id){
      $.getJSON("/report/survey/" + id, null, function(data) {
          window.open(data);
     });
}

现在在您的控制器中

public JsonResult Survey(int id)
{
    return Json(GetMyUrlMethod(id));
}

该代码在语法上并不完美,但沿着这些方向应该有效

答案 3 :(得分:2)

如果有人还在寻找这个。控制器操作可以具有常规参数或具有这些字段的模型对象。 MVC将自动绑定值。

<!-- on http://getbunnybox.com/hello -->
<link href="http://getbunnybox.nl/hallo" rel="alternate" hreflang="nl-NL" />

答案 4 :(得分:0)

您无法执行此操作,URL.Action是服务器端进程,因此将在客户端selectedRow可用之前进行解析。 Israfel有我建议的答案。

答案 5 :(得分:0)

如果selectedRow是客户端变量,则无效。您必须使用@Israfel实现进行链接。这是因为服务器端在客户端变量存在之前运行。

如果selectedRow是视图中的服务器端变量,请更改为:

window.open('&lt;%= Url.Action(“Report”,“Survey”,new {id = selectedRow})%&gt;');

这是因为id会推断selectedRow变量类型,或者你可以使用ToString()方法转换为字符串(只要它不是null)。

答案 6 :(得分:0)

这种可能被认为更干净的方法涉及使用T4MVC T4 templates。然后,您可以在视图中编写JavaScript,如下所示:

var reportUrl = '<%= Url.JavaScriptReplacableUrl(MVC.Survey.Report())%>';
reportUrl = myUrl.replace('{' + MVC.Survey.ReportParams.id + '}', selectedRow);

window.open(reportUrl);

这样做的好处是可以对控制器,操作和操作参数进行编译时检查。

答案 7 :(得分:0)

还有一件事可以做,我猜不是那么干净:

var url = "@Url.RouteUrl(new { area = string.Empty, controller = "Survey", action = "Report" })";
var fullUrl = url  + '?id=' + selectedRow;

答案 8 :(得分:0)

最简单的方法是声明一个javascript变量,而不是将参数值连接到链接。

  var url = '@Url.Action("Action","Controller")' + "/" + yourjavascriptvariable;
  <a href='" + url + "'>