【问题标题】:Generating an action URL in JavaScript for ASP.NET MVC在 JavaScript 中为 ASP.NET MVC 生成操作 URL
【发布时间】:2010-01-06 11:39:34
【问题描述】:

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

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

但我无法让它工作;它给出了以下错误:

CS1012: Too many characters in character literal.

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

有没有更简单的解决方案?

【问题讨论】:

  • 是JS错误吗?什么是渲染的 html-result?

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


【解决方案1】:

请记住, 之间的所有内容都被解释为 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 值,并将其替换为选定的行。

【讨论】:

【解决方案2】:

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

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

为了解决你的问题,我会这样做

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

【讨论】:

  • 简单有效。在剃须刀页面上,我需要使用&lt;script type="text/javascript"&gt; var rootMvcPath = '@Url.Content("~/")'; &lt;/script&gt;
【解决方案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));
}

该代码在语法上并不完美,但类似的东西应该可以工作

【讨论】:

  • 但我希望 url 由 Url.Action 生成,因为这样我还可以指定可以更改的 url 根参数!
  • 感谢您的回复。它可以工作,但为了获得一条简单的路线,我觉得进行 ajax 调用并不合适。但如果没有其他方法,我还是会这样做。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      如果 selectedRow 是客户端变量,它将不起作用。您必须使用 @Israfel 实现来链接。这是因为服务器端在客户端变量存在之前就运行了。

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

      window.open('');

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

      【讨论】:

        【解决方案7】:

        一种可能被认为更清洁的方法是使用T4MVC T4 templates。然后,您可以像这样在视图中编写 JavaScript:

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

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              猜你喜欢
              • 2015-02-08
              • 2017-11-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多