Как указать путь до определённого view

167
26 июля 2019, 22:50

Как вернуть представление в пост запросе, с помощью ajax?

На офф сайте microsoft написано что можно вернуть представление

return View("Views/Home/About.cshtml");

Но когда я отвечаю клиенту этим, то у меня приходит стандартная страничка. Как правильно прописывается абсолютный путь до файла?

У меня есть домашняя страница с которой идет ajax запрос к серверу:

function postSends(data){$.ajax({
type:'POST',
url: "/Method",
headers:{
    "Content-Type":"application/json; charset=utf-8",
    "Accept":"application/json; charset=utf-8"
},
data: JSON.stringify(method),//method - который пользователь выбирает на сайте
success: function (result) {
    $("#simulators").html(result);
},
error: function(xhr, textStatus, error){
    console.log(xhr.statusText);
    console.log(textStatus);
    console.log(error);
}});

} Дальше я думал сделать, чтобы была фабрика и в зависимости от метода отсылала определенный .cshtml файл. А как это сделать ХЗ.

Обработчик на стороне сервера:

public ActionResult Method(String method)
    {IMode factMode = FactoryMode(method);
        return View(factMode.GetCSSHTMLFile());}
Answer 1

Представления нельзя увидеть напрямую из интернета, эта папка веб-сервером не отдаётся.

Вам нужно в пост запросе указывать не путь ко вью (они не видны из интернета по пути), а указывать путь в формате /Controller/Action

Т.е. если у вас контроллер Home и ваш экшн About - указывайте url штатно как /Home/About При этом произойдёт вызов нужного вам экшена на контроллере и покажется нужное представление.

А если при этом вам "мешает" лишний вывод из штатного layout'а страницы - то вам просто не нужно его использовать: в файле Views/Home/About.cshtml укажите в первых строчках

@{
    _Layout = null;
}

Но вообще в подобных случаях предпочтительнее возвращать не готовую разметку из представления - а данные в формате Json. Для ApiController например есть уже готовые методы - достаточно прописать return this.Json(model);

Updated Ответ на уточнённый вопрос.

Дальше я думал сделать, чтобы была фабрика и в зависимости от метода отсылала определенный .cshtml файл.

У this.View есть несколько перегрузок, в том числе - которые принимают viewname - имя представления. Вы можете заготовить неколько разных вью и в экшене передавать имя и параметры.

Самый простой вариант: для представления About контроллера Home сложите несколько cshtml-файлов в папку /Views/Home/About и указывайте имя представления как About1.cshtml, About2.cshtml и т.п. без указания пути.

Альтернатива - полное имя с тильдой:

return View("~/Views/Home/About/About123.cshtml");

Для более сложных способов ознакомьтесь с тем, как происходит поиск файла представления. И вообще, можно настроить папки поиска представлений, если уж совсем кастом хочется.

READ ALSO
Замена числовых значений в datagridview на значения из массива без изменения основных данных

Замена числовых значений в datagridview на значения из массива без изменения основных данных

Имеется datagrigview к которому через datasource привязывается list<> с данными В list<> содержатся ид для подгрузки значений из других массивов Нашел...

169
Как получить Cell из DataGridRow в WPF?

Как получить Cell из DataGridRow в WPF?

Нужно получить значение из первой ячейки из строки DataGrid'а

165
Почему в адресе boolean параметр показывается дважды?

Почему в адресе boolean параметр показывается дважды?

Это перевод вопроса Why does query string parameter get included twice - aspnet boolean

189