Подтвердить что ты не робот

Создание URL-адреса действия в JavaScript для ASP.NET MVC

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

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

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

CS1012: Too many characters in character literal.

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 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 - это процесс на стороне сервера, поэтому он будет разбираться до того, как будет выбран выбранный клиент. У Исрафеля есть ответ, который я бы предложил.

Ответ 6

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

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

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

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

Ответ 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 + "'>