Создание URL-адреса действия в JavaScript для ASP.NET MVC
Я пытаюсь перенаправить на другую страницу, вызвав действие в контроллере с определенным параметром. Я пытаюсь использовать эту строку:
window.open('<%= Url.Action("Report", "Survey",
new { id = ' + selectedRow + ' } ) %>');
Но я не мог заставить его работать; он дает следующую ошибку:
CS1012: Too many characters in character literal.
Не могу ли я создать URL-адрес действия, который был на стороне клиента? Или мне нужно сделать вызов Ajax, предоставив параметр и вернув необходимый URL? Это не кажется правильным, но я хочу, если это единственный способ.
Есть ли более легкое решение?
Ответы
Ответ 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 + "'>