Как мне вызвать файл 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, используйте решение, описанное в этом посте.

Другие вопросы по тегам