Создание URL-адреса действия в JavaScript для ASP.NET MVC - PullRequest
19 голосов
/ 06 января 2010

Я пытаюсь перенаправить на другую страницу, вызывая действие в контроллере с определенным параметром. Я пытаюсь использовать эту строку:

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

Но я не мог заставить это работать; выдает следующую ошибку:

CS1012: Too many characters in character literal.

Не могу ли я сгенерировать URL-адрес действия, который был на стороне клиента? Или мне нужно сделать Ajax-вызов, указав параметр и вернув нужный URL? Это кажется неправильным, но я хочу, если это единственный путь.

Есть ли более простое решение?

Ответы [ 9 ]

53 голосов
/ 06 января 2010

Помните, что все между <% и%> интерпретируется как код C #, поэтому вы на самом деле пытаетесь оценить следующую строку C #:

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

C # считает, что одинарные кавычки окружают символьный литерал, поэтому вы получаете сообщение об ошибке (символические литералы могут содержать только один символ в C #)

Возможно, вы могли бы сгенерировать URL один раз в вашем скрипте страницы - где-нибудь на вашей странице HEAD, сделайте следующее:

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

Это даст вам строку Javascript, содержащую нужный вам URL, но с PLACEHOLDER вместо числа. Затем настройте обработчики кликов следующим образом:

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

т.е. после запуска обработчика вы найдете значение PLACEHOLDER в предварительно рассчитанном URL-адресе и замените его выбранной строкой.

9 голосов
/ 06 января 2010

Я обычно объявляю переменную javascript в разделе для хранения корня моего сайта.

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

Чтобы решить вашу проблему, я бы просто сделал

window.open(rootPath + "report/survey/" + selectedRow);
3 голосов
/ 06 января 2010

Не могли бы вы сделать

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

вместо того, где выбранная строка, я предполагаю, является идентификатором? Маршрутизация должна поднять это отлично.

или используйте 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));
}

Этот код синтаксически не совершенен, но что-то в этом роде должно работать

2 голосов
/ 29 июля 2015

Просто если кто-то все еще ищет это. Действие контроллера может иметь нормальные параметры или объект модели с этими полями. MVC свяжет Valus автоматически.

 var url = '@Url.Action("Action", "Controller")';
 $.post(url, {
      YearId: $("#YearId").val(),
      LeaveTypeId:  $("#LeaveTypeId").val()
 }, function (data) {
      //Do what u like with result
 });
0 голосов
/ 18 марта 2015

Самый простой способ - объявить переменную javascript, чем объединить значение вашего параметра со ссылкой.

  var url = '@Url.Action("Action","Controller")' + "/" + yourjavascriptvariable;
  <a href='" + url + "'> 
0 голосов
/ 07 июня 2014

Еще одна вещь, которую можно сделать, не так чисто, я думаю:

var url = "@Url.RouteUrl(new { area = string.Empty, controller = "Survey", action = "Report" })";
var fullUrl = url  + '?id=' + selectedRow;
0 голосов
/ 26 февраля 2014

Способ сделать это, который можно считать более чистым, заключается в использовании шаблонов T4MVC T4 . Затем вы можете написать JavaScript внутри своего представления следующим образом:

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

window.open(reportUrl);

Преимущество этого заключается в том, что вы получаете проверку во время компиляции для контроллера, действия и параметра действия.

0 голосов
/ 06 января 2010

Если selectedRow - переменная на стороне клиента, она не будет работать. Вы должны использовать реализацию @Israfel для ссылки. Это связано с тем, что на стороне сервера выполняется еще до того, как переменная на стороне клиента существует.

Если selectedRow является серверной переменной в представлении, измените ее на:

window.open ('<% = Url.Action ("Отчет", "Опрос", новый {id = selectedRow})%>');

Это потому, что идентификатор будет выводить тип переменной selectedRow, или вы можете преобразовать в строку с помощью метода ToString () (если он не нулевой).

0 голосов
/ 06 января 2010

Вы не сможете сделать это, URL. Действие - это процесс на стороне сервера, поэтому он будет анализироваться до того, как будет доступен выбранный клиентский ряд. У Исрафела есть ответ, который я бы предложил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...