Генерация URL действия в JavaScript для ASP.NET MVC

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

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

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

CS1012: Too many characters in character literal.

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

Существует ли более легкое решение?

19
задан ahsteele 12 March 2013 в 15:59
поделиться

5 ответов

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

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

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

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

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

Это даст вам строку Javascript, содержащую URL, который вам нужен, но с ПЛАСЕГОЛОВЫМИ вместо цифры. Затем установите обработчики кликов как:

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

т.е. когда обработчик запустится, вы найдете значение ПЛАСЕHOLDER в предварительно вычисленном URL и замените его на выбранную строку.

53
ответ дан 30 November 2019 в 02:05
поделиться

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

0
ответ дан 30 November 2019 в 02:05
поделиться
[

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

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

]Для решения вашей проблемы я бы просто сделал[

] [
window.open(rootPath + "report/survey/" + selectedRow);
]
9
ответ дан 30 November 2019 в 02:05
поделиться

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

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
ответ дан 30 November 2019 в 02:05
поделиться

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

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

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

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

0
ответ дан 30 November 2019 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: