Как обновить только предоставленные свойства уже существующей модели в ASP.NET MVC? - PullRequest
0 голосов
/ 08 февраля 2019

При связывании с моделью возможно ли предоставить модель из базы данных (уже заполненной ее значениями), а затем обновить эту модель, используя только то, что предоставляет веб-запрос?

Например, еслиУ меня есть эта модель:

public class Dog {
    public string Name {get; set;}
    public string Owner {get; set;}
}

И эта модель может быть заполнена из базы данных так:

Dog.Name == "Rolo"
Dog.Owner == "Matt"

И я получаю веб-запрос со следующими параметрами:

?name=Max

Тогда я хочу предоставить уже заполненную модель и обновить только свойство «Имя».

Полученный объект будет:

Dog.Name == "Max"
Dog.Owner == "Matt"

Владелецсвойство уже будет заполнено из базы данных, и мне не нужно будет копировать значения, любое дополнительное сопоставление и т. д.

Как можно достичь этого сценария с помощью ASP.NET MVC?

1 Ответ

0 голосов
/ 08 февраля 2019

При обновлении имени собаки вы хотите передать всю модель собаки, включая DogId, обратно в контроллер.Таким образом, вы можете запросить запись о собаке в базе данных и соответственно обновить.В следующем примере используется структура сущностей

public class Dog
{
   public int DogId { get; set; }
   public string Name { get; set; }
   public string Owner { get; set; }
} 


[HttpPost]
public async Task<ActionResult> UpdateDog(Dog model)
{
      if(!ModelState.IsValid)
          return View(model);

      var dbDog = await db.Dogs.SingleAsync(x => x.DogId = model.DogId);

      // ! at the beginning is shorthand for if the condition is false
      // this is just a shorter way of doing the other example below 
      if(!string.IsNullOrEmpty(model.Name))
      {
          dbDog.Name = model.Name;
      }

      if(string.IsNullOrEmpty(model.Owner))
      {
          // model.Owner is null or an empty string so we don't want to 
          // update. We can leave this blank
      }
      else
      {
         // model.Owner has a value in it so we will update
         dbDog.Owner = model.Owner
      }

      // you can update more properties here if you wish, or ignore them
      // dbDog.Owner = model.Owner

      await _db.SaveChangesAsync();

      return View(model);
}

Если вы не хотите передавать всю модель обратно, вы можете передать свою модель. Имя, как вы делаете, но вы также хотели бы включить model.DogIdтак что вы знаете, какую запись из базы данных вы хотите обновить.

UpdateDog? name = Max & dogId = 4

Надеюсь, это поможет.

// Реализация AutoMapper на основе комментария Выпотребуется создать профиль сопоставления, например:

using AutoMapper;

public class DogProfile : Profile
{
    public DogProfile()
    {
       CreateMap<DogViewModel, Dog>()
          .ForMember(destination => destination.Owner, options => options.Condition(source => string.IsNullOrEmpty(source.Owner))
          .ForMember(destination => destination.Name, options => options.Condition(source => string.IsNullOrEmpty(source.Name));
    }
}

Тогда в вашем UpdateDog ActionResult вы можете попробовать:

с использованием AutoMapper;

public class DogsController : Controller
{
    private readonly IMapper _mapper;

    public DogsController(IMapper _mapper)
    {
        _mapper = mapper
    }

    [HttpPost]
    public async Task<ActionResult> UpdateDog(DogViewModel viewModel)
    {
          if(!ModelState.IsValid)
              return View(viewModel);

          var dbDog = await db.Dogs.SingleAsync(x => x.DogId = viewModel.DogId);

          dbDog = _mapper.Map<Dog>(viewModel)

          await _db.SaveChangesAsync();

          return View(model);
    }
}

Также, неконечно, вы используете AutoMapper, но вам может потребоваться включить строку во фрагменте ниже в файле Startup.cs, если он у вас есть:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
       services.AddMvc();

       // Add this line 
       services.AddAutoMapper(typeof(Startup).Assembly);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...