Обновить модель из разных ViewModels

#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());}