2013-07-16 5 views
0

Доброе утро, я попытаюсь объяснить это как можно чище.Маршрут к этому действию с другим параметром MVC/JavaScript

Страница возвращает информацию для определенной учетной записи, но некоторые люди могут находиться в нескольких учетных записях, и я хочу предоставить функциональность для переключения между ними.

В настоящее время у меня есть настройки маршрута, как:

{controller}/{action}/{accountcode} 

{accountcode} может быть пустым, и это проверяется в действии и установить на свой код по умолчанию.

До сих пор я получил это работает отлично, так что вы можете посетить следующие ссылки:

{controller}/{action} OR {controller}/{action}/{accountcode} 

Так что я создал выпадающий список, который дает вам список у вас есть доступ, и при выборе он отправляет вам URL-адрес этой конкретной учетной записи.

Это отлично работает, когда я перехожу на {controller}/{action} и выбираю, так как он принимает window.location.href и добавляет значение выпадающего списка.

Однако, если вы находитесь на {controller}/{action}/{accountcode}, где выпадающий список перенаправляется, и вы выбираете учетную запись, она просто пытается добавить другой код учетной записи из-за моей потрепанной логики JavaScript.

Я предполагаю, что я ищу способ получить URL-адрес текущего действия без каких-либо параметров, чтобы я мог сам определить их. Вот где я борюсь, поскольку я не могу использовать методы Url Helper или Route Helper, поскольку эта функциональность находится на странице макета, что фактически означает, что мне нужно получить действие текущей страницы.

Вот мой код, надеясь, что обеспечивает ясность:

@if ((ViewBag.Accounts ?? new List<string>{"none"}).Count > 1) 
{ 
    @Html.DropDownList("accounts", new SelectList(ViewBag.Accounts, ViewBag.AccountCode)) 
} 

$(function() { 
    $("#accounts").change(function() { 
     window.location.href = window.location.href + "/" + $(this).val(); 
    }); 
}); 

Ура!

ответ

2

Однако, когда вы находитесь в {контроллер}/{действие}/{accountcode}, где выпадающий перенаправляет, и выберите учетную запись, он просто пытается добавить еще один код счета из-за моего потертый логика javascript.

Ну, вы могли бы легко исправить эту потрепанную логику с помощью URL-хелперы:

<script type="text/javascript"> 
    $(function() { 
     $("#accounts").change(function() { 
      var url = '@Url.Action(null, new { accountcode = "__code__" })'; 
      url = url.replace('__code__', $(this).val()); 
      window.location.href = url; 
     }); 
    }); 
</script> 

или, если это находится в отдельном файла JavaScript, то просто вставлять базовый URL как HTML 5 Data- * атрибута к вашему выпадающего меню:

@if ((ViewBag.Accounts ?? new List<string>{"none"}).Count > 1) 
{ 
    @Html.DropDownList(
     "accounts", 
     new SelectList(ViewBag.Accounts, ViewBag.AccountCode), 
     data_url = Url.Action(null, new { accountcode = "__code__" }) 
    ) 
} 

, а затем в отдельном файла JavaScript просто использовать это значение:

$(function() { 
    $("#accounts").change(function() { 
     var url = $(this).data('url'); 
     url = url.replace('__code__', $(this).val()); 
     window.location.href = url; 
    }); 
}); 
+0

блестящий пример, спасибо. Я боролся с этим, так как я не знал, что вы можете передать null агентам Razor Url, чтобы получить одно и то же действие, поэтому я пытался манипулировать 'Request.Url.Segments' в JavaScript, чтобы дать мне то, что я хотел. В целом 200% более чистый подход. – Malkin

+1

+1 для предложения 'data- *'. Не нужно беспокоиться о том, спрятана ли строка справа. – millimoose

0

Убедитесь, что базовый URL-адрес имеет только значения {controller}/{action}.

window.location = "/Controller/MyAction/" + $(this).val();

или использовать Url вспомогательный класс:

window.location = "@Url.Action("MyAction")/" + $(this).val();

+0

Я бы рекомендовал против hardcoding urls, как показано в обоих примерах. Вместо этого я рекомендовал бы использовать помощники Url. –

+0

Приветствия для ответа, но действие также неизвестно (должно быть динамически найдено) – Malkin

Смежные вопросы