Вопрос
У меня есть несколько ViewComponents, которые выглядят так:
public IViewComponentResult Invoke(BuyerViewModel buyer)
Я бы хотел, чтобы они могли принимать либо BuyerViewModel
, либо строку JSONпредставляющий BuyerViewModel
.Например, когда вы передаете JSON методу контроллера из JavaScript, если этот метод ожидает аргумент типа Dog
, контроллер автоматически пытается десериализовать JSON в экземпляр Dog
.Я пытаюсь имитировать это поведение.
Цель состоит в том, чтобы оба из этих примеров работали:
var buyer = new BuyerSummaryViewModel() { FirstName = "John" };
ViewComponent("Buyer", buyer);
ViewComponent("Buyer", "{\"Name\":\"John Smith\"}");
Почему?
Я пытаюсь создать универсальный метод JavaScript, который может извлекать ViewComponent на лету:
const fetchViewComponent = async (viewComponentName, viewModel) => {
let data = { viewComponentName, viewModel };
let html = await $.get(`/Order/FetchViewComponent`, data);
return html;
}
//Get a BuyerViewComponent (example)
(async () => {
let component = await fetchViewComponent("Buyer", `@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.Buyer))`);
console.log(component);
})();
Что я пробовал
Если я укажучто ViewModel BuyerViewModel
, это работает.Строка JSON автоматически десериализуется в BuyerViewModel
.
public class FetchViewComponentRequest
{
public string ViewComponentName { get; set; }
public BuyerViewModel ViewModel { get; set; }
// ^^^^^^^^^^^^^^
}
[HttpGet]
public IActionResult FetchViewComponent(FetchViewComponentRequest request)
{
return ViewComponent(request.ViewComponentName, request.ViewModel);
}
Проблема
Однако я не хочу указывать тип;Я хочу, чтобы это было generic .Итак, я попробовал это:
public class FetchViewComponentRequest
{
public string ViewComponentName { get; set; }
public string ViewModel { get; set; }
// ^^^^^^
}
[HttpGet]
public IActionResult FetchViewComponent(FetchViewComponentRequest request)
{
return ViewComponent(request.ViewComponentName, request.ViewModel);
}
Но, как и ожидалось, request.ViewModel
не правильный тип;это заканчивается null
в методе Invoke
.Я надеялся, что есть флаг или что-то более глобальное, что я мог бы указать, чтобы он попытался неявно десериализовать эту строку в ожидаемый тип.
Есть ли более простой способ сделать это, который я не рассматривал?Или, если нет, то, как я это представляю, вообще возможно?
(я использую .NET Core 2.2 )