JavaScript中生成ASP.NET MVC的操作URL

20

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

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

但我无法使它工作;它会给出以下错误:

CS1012:字符文字中的字符过多。

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

有更简单的解决方案吗?


这是JS错误吗?渲染的HTML结果是什么? - Mathias F
9个回答

54

记住,<% 和 %> 之间的所有内容都被解释为 C# 代码,所以你实际上正在尝试评估以下一行 C# 代码:

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

C#认为单引号包含一个字符字面量,因此您得到了错误消息(在C#中,字符字面量只能包含一个字符)。

也许您可以在页面脚本中生成URL-在页面头部的某个地方执行此操作:

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

这将给你一个包含所需URL的Javascript字符串,但其中的数字会替换为PLACEHOLDER。然后按如下方式设置点击处理程序:

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

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


我不知道这是否能帮到你,但这个问题/答案对我很有帮助。https://dev59.com/Y1TTa4cB1Zd3GeqPt5uD#5094357 - Steve Duitsman

10

通常我会在<head>标签中声明一个JavaScript变量,用于保存我的网站根目录。

<%="<script type=\"text/javascript\">var rootPath = '"
    + Url.Content("~/") + "';</script>" %>
为了解决你的问题,我会简单地执行
window.open(rootPath + "report/survey/" + selectedRow);

简单而有效。在 Razor 页面中,我需要使用以下代码: <script type="text/javascript"> var rootMvcPath = '@Url.Content("~/")'; </script> - JabberwockyDecompiler

3

Could you do

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));
}

那段代码语法不完美,但类似的代码应该可以工作。

但是我希望URL由Url.Action生成,因为这样我也可以指定可能会更改的URL根参数! - canxss
谢谢回复。它可以工作,但为了得到一个简单的路由,使用ajax调用似乎不太好。但如果没有其他办法,我还是会这样做的。 - canxss

2

如果有人仍在寻找答案,控制器操作可以具有普通参数或包含这些字段的模型对象。MVC会自动绑定这些值。

 var url = '@Url.Action("Action", "Controller")';
 $.post(url, {
      YearId: $("#YearId").val(),
      LeaveTypeId:  $("#LeaveTypeId").val()
 }, function (data) {
      //Do what u like with result
 });

1
一种可能被认为更加清晰的方法是使用T4MVC T4模板。然后,您可以在视图中像这样编写JavaScript:
var reportUrl = '<%= Url.JavaScriptReplacableUrl(MVC.Survey.Report())%>';
reportUrl = myUrl.replace('{' + MVC.Survey.ReportParams.id + '}', selectedRow);

window.open(reportUrl);

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

0
还有一件事可以做,可能不太干净吧。
var url = "@Url.RouteUrl(new { area = string.Empty, controller = "Survey", action = "Report" })";
var fullUrl = url  + '?id=' + selectedRow;

0

最简单的方法是声明一个JavaScript变量,然后将您的参数值连接到链接中。

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

0

你无法做到这一点,URL.Action是一个服务器端的过程,因此会在客户端选择行可用之前进行解析。我建议使用Israfel的答案。


0
如果selectedRow是客户端变量,它是不能正常工作的。您必须使用@Israfel实现来链接。这是因为服务器端运行在客户端变量甚至存在之前。
如果selectedRow是视图内的服务器端变量,请更改为以下内容:
window.open('<%= Url.Action("Report", "Survey", new { id = selectedRow } ) %>');
这是因为id将推断selectedRow变量类型,或者您可以使用ToString()方法转换为字符串(只要它不为null)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接