Member 12658724 Ответов: 2

Окно.местоположение.href передайте неправильный параметр контроллеру


На мой взгляд, я хочу передать параметры контроллеру.
window.location.href = "@Url.Action("index", "Survey")?languageName="
                   + selectedValue + "&id=@Model.CampaignGuid";


Мой контроллер:
public ActionResult Index(Guid id, string languageName)
       {

Я уверен, что строка запроса верна. В строке запроса я увидел, что имя языка - "испанский". Но когда я устанавливаю точку останова в индексном методе, она всегда становится "английской".Это происходит, даже если я полностью закрываю страницу и перезагружаю ее, как будто она где-то кэширована. Я знаю, что это что-то простое, но я никогда не сталкивался с этим раньше.

У меня есть маршрут
routes.MapRoute("SurveyWelcomeRoute", "Survey/{id}/{languageName}",
                            defaults: new { action = "Index", controller = "Survey", languageName="English" });


Что я уже пробовал:

Я нашел похожий в ASP.NET MVC RedirectToAction передает неправильное значение параметра? - переполнение стека[^]
Но я все еще не знаю причины. Я потратил на это более 7 часов. Понятия не имею.

Kornfeld Eliyahu Peter

Что такое фактический HTML-код?
Опрос/индекс / английский? languageName=испанский& id=...?

Member 12658724

http://localhost:17671/Survey/ab7f6bda-9f5e-44d7-9bd2-63c24e6b6adb?languageName=Spanish&id=ab7f6bda-9f5e-44d7-9bd2-63c24e6b6adb

2 Ответов

Рейтинг:
6

F-ES Sitecore

Я не думаю, что вам нужен индивидуальный маршрут, не уверен, что это только сбивает вас с толку. Но с вашим маршрутом url должен быть

/ Опрос / идентификатор / язык

так

/ Обзор/b4cc6a5a-9f2a-4e61-9815-9709b43a26a3 / испанский

как вы можете видеть, url-адрес, который вы генерируете, совсем не похож на этот. Кроме того если вы хотите создать путь с пользовательским маршрутом для этого есть другой вызов метода

window.location.href = "@(Url.RouteUrl("SurveyWelcomeRoute", new { id = Model.CampaignGuid, languageName = UrlParameter.Optional }))/" + encodeURI(selectedValue);


Рейтинг:
1

Kornfeld Eliyahu Peter

Есть две вещи...
Один из них-это смешивание различных подходов к созданию URL-адресов... Существует старая и хорошая кодировка HTTP URL с http://site-address/page.html?param1=value1&параметр2=значение2. И есть маршрутизация MVC, которая использует форму http://site-address/page/value1/value2.
Нельзя их смешивать и ожидать правильного поведения...
Вторая-распространенная ошибка. Мы все упускаем из виду документацию об UrlHelper.Действие, которое объясняет, что функция создаст URL-адрес в соответствии с соответствующим отображением из таблицы маршрутов...
В вашем случае "индекс" опущен, так как это действие по умолчанию, а идентификатор добавлен по запросу, но не является необязательным ("английский" отсутствует по той же причине, что и "индекс")... затем наступает ваша роль...

http://localhost:17671 -- site address
Survey -- controller
-- action is missing, as it has a default value
ab7f6bda-9f5e-44d7-9bd2-63c24e6b6adb -- id value (from model)
-- languageName missing, as it has a default value
?languageName=Spanish&id=ab7f6bda-9f5e-44d7-9bd2-63c24e6b6adb -- the part you wrote

Итак-у вас есть два варианта: использовать значение идентификатора, которое у вас уже есть из модели, или использовать другое (в вашем случае это, кажется, первое)...
location href = "@Url.Action("Index", "Survey")" + "/" + selectedValue"
Или
location.href = "@Url.Action("Index", "Survey", new { id = UrlParameter.Optional })" + "/" + "@Model.CampaignGuid" + "/" + selectedValue


Member 12658724

Я использую ваш первый код. Это работает в первый раз. Во второй раз, если я снова выберу "испанский", url-адрес станет http://localhost:17671/Survey/ab7f6bda-9f5e-44d7-9bd2-63c24e6b6adb/Spanish/Spanish Вы видите, что в конце url-адреса есть два "испанских".

Одного я до сих пор не понимаю-почему ты не добавил id в url-адрес? Я думал, что вы переопределяете url-адрес, а url-адрес не имеет значения id. Таким образом, значение идентификатора будет потеряно?