Фактическая проблема здесь заключается в том, что вы передаете косые черты как значение строки запроса без использования процентного кодирования , как показано в коде перенаправления ниже:
window.location.href = '@Url.Action("addNew", "Home")?MenuId=' + 1 + '&viewname=' + 'Views/Test/Add.cshtml';
Сгенерированный URL-адрес из приведенного выше примера будет выглядеть следующим образом: это недопустимый URL-адрес, поскольку косая черта является зарезервированным символом в строке URL-адреса, поэтому при обработке вашего запроса появилось сообщение « Произошла ошибка »:
/Home/addNew?MenuId=1&viewName=Views/Test/Add.cshtml => invalid trailing slashes
Чтобы решить эту проблему, необходимо поставить вспомогательный параметр @Url.Encode()
, чтобы косые черты кодировались как %2f
вместо:
window.location.href = '@Url.Action("addNew", "Home")?MenuId=' + 1 + '&ViewNames=' + '@Url.Encode("Views/Test/Add.cshtml")';
, которая генерирует строку запроса в кодировке URL:
/Home/addNew?MenuId=1&ViewNames=Views%2fTest%2fAdd.cshtml => valid
Если вы передаете URL из свойств переменной / viewmodel на стороне сервера, убедитесь, что все специальные символы, переданные в виде строки запроса, кодируются первыми:
window.location.href = '@Url.Action("addNew", "Home")?MenuId=' + @MenuId + '&ViewNames=' + '@Url.Encode(ViewName)';
Тем не менее, я думаю, что лучше включить путь к файлу в метод действия и передавать просто имя представления без расширения, если вы хотите загрузить частичное представление из той же папки, следовательно, избегая использования Url.Encode()
:
public ViewResult addNew(string MenuId, string ViewNames)
{
return View(@"~/Views/Test/" + ViewNames + ".cshtml");
}
Примечания:
1) window.location.href
перезагрузит всю страницу, для этого необходимо использовать ViewResult
. Если вы хотите обновить частичное представление без перезагрузки всей страницы, используйте вместо этого обратный вызов AJAX.
$('#btn_add').click(function (e) {
$.ajax({
url: '@Url.Action("addNew", "Home")',
type: 'GET',
data: { MenuId: 1, ViewNames: '@Url.Encode("Views/Test/Add.cshtml")' },
success: function (result) {
$('#targetElement').html(result);
},
error: function (xhr, status, err) {
// error handling
}
});
});
2) Параметры метода действия могут распознавать символы кодирования процентов и возвращать их в исходную строку.
Похожие проблемы:
Символы разрешены в URL