При обновлении имени собаки вы хотите передать всю модель собаки, включая 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);
}
}