Я пытаюсь перенаправить к другой странице путем вызова действия в контроллере с определенным параметром. Я пытаюсь использовать эту строку:
window.open('<%= Url.Action("Report", "Survey",
new { id = ' + selectedRow + ' } ) %>');
Но я не мог заставить его работать; это дает следующую ошибку:
CS1012: Too many characters in character literal.
Разве я не могу генерировать URL действия, это было на стороне клиента? Или я должен выполнить вызов Ajax путем предоставления параметра и возвратить необходимый URL? Это не кажется правильным, но я хочу к тому, если это - единственный путь.
Существует ли более легкое решение?
Помните, что все между <% и %> интерпретируется как код на 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 и замените его на выбранную строку.
Вы не сможете этого сделать, URL.Action - это процесс на стороне сервера, поэтому он будет разобран до того, как клиентская сторона selectedRow будет доступна. У Исрафеля есть ответ, который я бы предложил.
]Обычно я объявляю переменную javascript в разделе для удержания корня моего сайта.[
] [<%="<script type=\"text/javascript\">var rootPath = '"
+ Url.Content("~/") + "';</script>" %>
]
[]Для решения вашей проблемы я бы просто сделал[
] [window.open(rootPath + "report/survey/" + selectedRow);
] Не могли бы вы сделать
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));
}
Этот код не является синтаксически совершенным, но что-то в этих строках должно работать
.Если selectedRow является переменной на стороне клиента, она не будет работать. Вы должны использовать реализацию @Israfel для ссылки. Это связано с тем, что серверная сторона запускается до того, как клиентская переменная вообще существует.
Если selectedRow является серверной переменной в представлении, измените на это:
window.open ('<% = Url.Action ("Report", "Survey", new {id = selectedRow})% > ');
Это связано с тем, что идентификатор будет выводить тип переменной selectedRow, или вы можете преобразовать в строку с помощью метода ToString () (если он не равен нулю).