Як отримати доступ до змінної javascript у @ URL.Action ()


77

Як я можу отримати доступ до значення JavaScript всередині @URL.Action()? щось на зразок:

<script type="text/javascript">
function name(myjavascriptID)
{
     jQuery("#list_d").jqGrid('setGridParam', { url: '@URL.Action("download file", "download", new { id = <myjavascriptID> })', page: 1 });

}
</script>

Відповіді:


139

Ви не можете. JavaScript не виконується під час створення URL-адреси дії. Що ви можете зробити, це зробити щось подібне:

function name(myjavascriptID)    {
     var link = '@Url.Action("download file", "download", new { id = "-1" })';
     link = link.replace("-1", myjavascriptID);

     jQuery("#list_d").jqGrid('setGridParam', { url: link, page: 1 });
}

Дякую за вашу відповідь, це працює з однією невеликою модифікацією: замість link.hrefмені потрібно використовувати link. Дуже дякую!
Болу,

Що робити, якщо ідентифікатор буде таким, як "Hello world"?
Nic

Ідея полягає в тому, щоб -1 був чимось однозначно ідентифікуваним у рядку, щоб ви могли замінити його чим завгодно. Вам потрібно було б переконатися, що Hello World закодовано, як Hello + World. Але так, замініть його чим завгодно
Brian Mains

2
чи немає чистого рішення?
липня

1
URL видалити капітал приставкою до того, @URL.Action щоб , @Url.Actionяк це показує компіляції помилка часу
Shaiju T

17

Я роблю щось досить подібне, але менш багатослівне:

var myUrl = '@Url.Action("Solution","Partner")/' + myjavascriptID;
$.ajax.load(myUrl); // or whatever

Ми можемо зробити це через маршрутизацію, і зрештою Url.Action з параметрами словника маршруту перекладається в URI, який виглядає так:

http://localhost:41215/Partner/Solution?myJavascriptID=7

Просто другий вибір, бо як одного разу сказав мудрий старий: "Це наш вибір, Гаррі, що показує, ким ми є насправді, набагато більше, ніж наші здібності".


Це порушить конфігурацію RoutAttribute: ((((
Кейт

11

Ви можете передати змінні до будь-якого посилання, як показано нижче ...

var url = '@Html.Raw(@Url.Action("MethodName", "ControllerName"))' + '?id = ' + myjavascriptID

1

Точно так само, як і відповідь Брайана Мейнза, ви можете відформатувати рядок URL-адреси, замість того, щоб замінювати -1 своєю змінною, тобто якщо, як і я, ви вважаєте, що краще читати. Наступна відповідь передбачає, що ви змінили Stringпрототип, як запропоновано у цій відповіді :

var url = unescape('@Url.Action("download file", "download", new { id = "{0}" })').format(myjavascriptID);

unescapeВиклик необхідний , якщо ви хочете , щоб декодувати {0}. Мені подобається ця альтернатива, оскільки вона полегшує отримання кількох параметрів із змінних JS. Наприклад:

var url = unescape('@Html.Raw(Url.Action("Action", "Controller", new { id = "{0}", name = "{1}" }))').format(myID, myName);

Я додав Html.Rawу своєму другому прикладі, щоб уникнути наявності &ampв рядку url.


Додати свою відповідь з цим і отримав ідеальний відповідь: stackoverflow.com/a/36981170/453142
Девід ЛеТорно

0

Ви можете побудувати код JavaScript на C # таким чином:

function fun(jsId) {
  var aTag = '<a href="@Html.Raw(@Url.Action("ActionName", "ControllerName", new { objectId = "xxx01xxx" }).Replace("xxx01xxx", "' + jsId + '"))">LINK</a>';
}

Ось код із запитання, переписаного за допомогою цієї техніки:

function name(myjavascriptID) {
  jQuery("#list_d").jqGrid('setGridParam', { url: '@Html.Raw(@URL.Action("download file", "download", new { id = "XXXmyjavascriptIDXXX" }).Replace("XXXmyjavascriptIDXXX", "' + myjavascriptID + '"))', page: 1 });
}

0

Ви можете замінити url як код нижче

var jsUrl = '@Url.Action("action", "controller")'; // ## is the token
var getUrl = jsUrl.replace('action', action).replace('controller', controller)  
$("#RenderPartial").load(getUrl); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.