Как мне вызвать файл cshtml из javascript/jquery?
Я пытаюсь добавить каскадные выпадающие списки на страницу моего сайта. Я следовал примеру, представленному на http://www.mikesdotnetting.com/article/196/webmatrix-jquery-cascading-dropdown-lists. Единственное изменение состоит в том, что я изменил имена переменных в соответствии с моим приложением и, как Я хочу, чтобы функциональность существовала только в определенных ситуациях (например, при создании новой записи), вокруг соответствующего кода есть оператор if.
Хотя мой 2-й выпадающий список отключен при загрузке страницы (как и ожидалось), он не включается, когда выбирается один из элементов 1-го выпадающего списка.
Я подозреваю, что я не вызываю GetClients.cshtml (мой вариант GetProducts.cshtml Майка), вероятно, из-за строки:
$.getJSON('/GetClients/' + ActivityID, function (clients) {
не смотрит в нужную папку.
В идеальном мире я мог бы использовать Razor тильду (~), чтобы задать полный путь, который выглядел бы правильно, независимо от версии сервера или локального хоста. Но это не похоже на вариант в JavaScript.
GetClients.cshtml находится в той же папке, что и файл cshtml, содержащий код JS, раскрывающиеся списки HTML и т. Д., Которыми я пытаюсь управлять. Может ли кто-нибудь сообщить мне, ссылается ли приведенный выше код на файл "по соседству" или нет, и если нет, то к чему я должен внести изменения в приведенную выше строку кода?
3 ответа
Если ваш файл GetClients.cshtml находится в папке ниже корневого каталога, вам нужно включить эту папку в URL-адрес, который вы передаете методу getJSON. Например, скажем, ваша структура выглядит следующим образом:
root
folder
GetClients.cshtml
CallingPage.cshtml
Default.cshtml
etc
URL, который вы передаете методу getJSON, должен быть /folder/getclients
плюс любые дополнительные URLData/ строки запроса, которые вы хотите передать.
Вы не можете вызвать view напрямую из Javascript, поэтому просто создайте Action в ASP.NET MVC Controller, который возвращает это представление.
public MyController{
public ActionResult GetMyCoolCshtmlFile(){
return View("pathToMyCoolCshtml.cshtml");
}
}
и позвоните в JS:
$.get("/my/GetMyCoolCshtmlFile").done(function(yourMarkup){doWhatYouWantWithYourMarkup(yourMarkup);})
У вас не будет прямого доступа к виду бритвы, вы получите доступ к нему с помощью метода действия.
Я думаю, проблема в том, что вы получаете 404, потому что путь не правильный. Если вы откроете консоль браузера, вы должны увидеть ошибку 404.
Использовать Url.Action
HTML вспомогательный метод для создания правильного относительного пути к вашему методу действия.
var url="@Url.Action("GetClients","YourcontrollerName")";
$.getJSON(url + ActivityID, function (clients) { });
Когда механизм представления бритвы выполняет это представление, он вызывает вспомогательный метод и использует вывод этого вызова метода (который является правильным относительным путем к методу действия) в переменную javascript. Это решение будет работать независимо от вашей текущей страницы / URL.
Предполагая, что у вас есть метод действия под названием GetClients
который принимает идентификатор и возвращает клиентов в формате JSON.
public ActionResult Getclients(int id)
{
// to do : Return a list of Clients as json
}
Приведенный выше код будет работать, если он находится внутри бритвы. Если ваш код находится внутри файла javascript, используйте решение, описанное в этом посте.