#c# #api #asp.net-core #controller #viewmodel
#c# #API #asp.net-ядро #контроллер #viewmodel
Вопрос:
У меня есть следующий класс в решении .net core
public class User
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual string Address { get; set; }
public virtual string Address1 { get; set; }
public virtual string ZipCode { get; set; }
public virtual string City { get; set; }
public virtual Enum.ValidateStatus ValidateStatus { get; set; }
public virtual string ProfileImage { get; set; }
public virtual string Phone { get; set; }
public virtual string Mobile { get; set; }
public virtual Enum.LoginType LoginType { get; set; }
public virtual string PassWord { get; set; }
}
Из этого класса я создал две ViewModels
public class ProfileViewModel
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual string Address { get; set; }
public virtual string Address1 { get; set; }
public virtual string ZipCode { get; set; }
public virtual string City { get; set; }
public virtual string ProfileImage { get; set; }
public virtual string Phone { get; set; }
public virtual string Mobile { get; set; }
}
public class AdminViewModel
{
public virtual int ID { get; set; }
public virtual Enum.ValidateStatus ValidateStatus { get; set; }
public virtual Enum.LoginType LoginType { get; set; }
}
Я использую две модели в формах и обновляю с помощью общего
public class SaveData<T>
{
public async Task<T> Save(T saveItem, IHttpClientFactory httpClientFactory)
{
var client = httpClientFactory.CreateClient();
var content = new StringContent(JsonSerializer.Serialize(saveItem), Encoding.UTF8, "application/json");
using (var response = await client.PostAsync("api/User/", content).ConfigureAwait(false))
{
var stringResult = (await response.Content.ReadAsStringAsync());
var options = new JsonSerializerOptions { IncludeFields = true, PropertyNameCaseInsensitive = true };
T result = System.Text.Json.JsonSerializer.Deserialize<T>(stringResult, options);
return resu<
}
}
}
Мой контроллер выглядит примерно так:
public ActionResult<Comito.Core.Model.Entity.User> Post([FromBody] JsonDocument saveItem)
{
var saveUserViewModel = JsonSerializer.Deserialize<ProfileViewModel>(saveItem.RootElement.ToString());
}
В этой версии контроллера я предполагаю, что переданной моделью является ProfileViewModel, и в этом проблема. В любом случае, я в контроллере могу определить, какая модель была отправлена.
Я знаю, что мог бы создать контроллер для каждой модели, но это не тот путь, которым я пойду.
Комментарии:
1. Вы проверяли схемы JSON? Я думаю, это единственный способ связать JSON с фактическим типом C #. Вы можете создавать схемы для описания ваших объектов ViewModel, затем проверять схему на соответствие возможным входным данным и на основе этого определять тип для передачи в десериализацию.
2. Большое спасибо — я не могу найти никакой документации для создания схемы с использованием System.Txt.Json, должен ли я использовать NewtonSoft
3. Почему бы не попробовать добавить параметр в действие, чтобы сохранить modelname? И использовать так:
If(modelname=="ProfileViewModel"){var saveUserViewModel = JsonSerializer.Deserialize<ProfileViewModel>(saveItem.RootElement.ToString());}else{var saveUserViewModel = JsonSerializer.Deserialize<AdminViewModel>(saveItem.RootElement.ToString());}