gpt4 book ai didi

c# - 具有复杂模型的 asp.net Core 2 自定义模型绑定(bind)器

转载 作者:太空宇宙 更新时间:2023-11-03 22:52:39 24 4
gpt4 key购买 nike

我在 asp.net core 2 中构建 Custom-Model-Binder 时遇到问题。我读了这个Tutorial但这不是我需要的。

我有一个构建示例并放在 github

我有一个像这样的简单的 Person 类:

public class Person
{
public int ID { get; set; }

[Required]
public string Firstname { get; set; }

[Required]
public string Surename { get; set; }

[Required]
[DisplayFormat(DataFormatString = "{0:dd.MMM.yyyy}")]
public DateTime DateOfBirth {get;set;}

[Required]
public Country Country { get; set; }
}

public class Country
{
public int ID { get; set; }

public string Name { get; set; }

public string Code { get; set; }
}

当我添加一个新人时,我可以使用 HTML 选择标签选择国家。但是 select 标签的值是国家 ID,我希望 Binder 在数据库中查找并将正确的国家放入模型中。

Controller 中的创建方法如下所示:

    [HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,Firstname,Surename,DateOfBirth")] Person person, int Country)
{
ViewData["Countries"] = _context.Countries.ToList();

if (ModelState.IsValid)
{
_context.Add(person);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(person);
}

我还实现了一个 IModelBinder 来绑定(bind)数据:

 public class PersonEntityBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}

// here goes the fun

// looking for the countryId in the bindingContext

// binding everything else except the CountryID

// search the Country by countryID and put it to the model


return Task.CompletedTask;
}
}

问题是,我怎样才能像我在 Binder 的评论中写的那样做到这一点?任何想法或最佳实践解决方案?

问候克里斯

最佳答案

首先,这是对自定义模型 Binder 的错误使用。数据访问应该发生在 Controller 中,因为这是 Controller 的职责。二、don't use [Bind] .喜欢认真。只是不要。这太可怕了,它会杀死小猫。

像这样创建一个 View 模型:

public class PersonViewModel
{
public string FirstName { get; set; }
public string Surname { get; set; }
public DateTime DateOfBirth { get; set; }
public int CountryID { get; set; }
}

然后,您是否采取行动接受它(不再需要 [Bind]):

public async Task<IActionResult> Create(PersonViewModel model)

然后,在您的操作中,将发布的值映射到 Person 的新实例,并通过从数据库中查找来填充 Country 属性:

 var person = new Person
{
FirstName = model.FirstName,
Surname = model.Surname,
DateOfBirth = model.DateOfBirth,
Country = db.Countries.Find(model.CountryID)
}

然后,照常保存person

关于c# - 具有复杂模型的 asp.net Core 2 自定义模型绑定(bind)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46769754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com