Я работаю со страницами Razor и не могу получить свой объект dto в javascript map с классом в модели, используя функцию jquery .load.

Итак, пользователь нажимает кнопку в пользовательском интерфейсе, и запускается следующий javascript:

$('#btnGoToResults').click(function (e) { var dto = { ID: 1, CODE: 5 }; $('#divPerformanceResults').load('/PerformanceSearch?handler=ResultsPartial', dto); // Gives error 400 } 

Я также попробовал следующее, не заставляя его работать:

 $('#divPerformanceResults').load('/PerformanceSearch?handler=ResultsPartial', JSON.stringify(dto)); // "works" since the code behind is hit but the dto values are 0 

Также попробовал переписать с помощью ajax:

 // Gives error 400 $.ajax({ url: '/PerformanceSearch?handler=ResultsPartial', data: JSON.stringify(dto), dataType: 'json', contentType: 'application/json', type: 'POST', success: function (data) { $('#divPerformanceResults').html(data); } }); 

Это модель, которую я пытаюсь сопоставить:

 public class RequestResultModel { public int ID { get; set; } public int CODE { get; set; } } 

Это параметр для метода, создающего и возвращающего частичное представление, которое будет содержать всю логику для фильтрации:

 public PartialViewResult OnGetResultsPartial(RequestResultModel dto) { Results = new List{amp}lt;PerformanceResultModel{amp}gt;() { ... }; return new PartialViewResult { ViewName = "_PerformanceResults", ViewData = new ViewDataDictionary{amp}lt;List{amp}lt;PerformanceResultModel{amp}gt;{amp}gt;(ViewData, Results) }; } 

Метод работает, а частичное отображается так, что все это хорошо. Мне нужно только начать работать, чтобы я мог отфильтровать список результатов. Я заставил следующее работать, переключив параметр метода на int, но это только один параметр, мне понадобятся несколько входов позже.

 $('#divPerformanceResults').load('/PerformanceSearch?handler=ResultsPartial', 'ID=15'); // This works. Only one param though 

Приложил журнал Chrome также, если это что-то дает: введите описание изображения здесь

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

Благодарность!

Ваша первая версия .load () была хороша, метод jquery load () сделает http post, если обнаружит dto param как объект:

 $('#divPerformanceResults').load('/PerformanceSearch?handler=ResultsPartial', dto); 

и затем вы можете добавить атрибут [HttpPost] к вашему действию, чтобы принимать методы публикации

  [HttpPost] public PartialViewResult OnGetResultsPartial(WebApplication1.Models.RequestResultModel dto) { 

Хорошо. После еще нескольких испытаний и исследований я попал по адресу: https://www.learnrazorpages.com/security/request-verification

Где я узнал, что на страницы бритвы добавлены токены, запрещающие посты без него.

Таким образом, вы можете игнорировать проверку токена на глобальном уровне или на уровне класса, например:

 [IgnoreAntiforgeryToken(Order = 1001)] public class IndexModel : PageModel { public void OnPost() { } } 

Или вы можете сделать, как я сделал в следующем:

Прежде всего, переименуйте метод в OnPost вместо OnGet:

 public PartialViewResult OnPostResultsPartial(RequestResultModel dto) 

Затем в вызов javascript включите токен, как показано ниже:

 $('#btnGoToResults').click(function (e) { var dto = { ID: 1, CODE: 5 }; $('#divPerformanceResults').load('/PerformanceSearch?handler=ResultsPartial', { dto: dto, __RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val() }); } 

И это все! Теперь он правильно сопоставляет объект javascript с классом в модели страницы :) Надеюсь, это поможет другим!