如果我有两个模型类要合并到一个通用的视图模型中,就像这样:
public class PersonViewModel
{
public string Name { get; set; }
}
public class GroupViewModel
{
public string Name { get; set; }
}
public class PersonAndGroupViewModel
{
public PersonViewModel Person { get; set; }
public GroupViewModel Group { get; set; }
}
是否有可能像这样通过一次性将它们都保存到数据库中?
@model Solution.Models.PersonAndGroupViewModel
<form asp-action="SavePersonAndGroup">
<input asp-for="Person.Name">
<input asp-for="Group.Name">
<button type="submit">Save</button>
</form>
public async Task<IActionResult> SavePersonAndGroup(
[Bind("Group.Name,Person.Name")]
PersonAndGroupViewModel model)
{
if (ModelState.IsValid)
{
Person person = auto.Map<Person>(model.Person);
Group group = auto.Map<Group>(model.Group);
db.Add(Person);
db.Add(Group);
await db.SaveChangesAsync();
return RedirectToAction("Details", "Groups", new { id = group.Id });
}
return View(model);
}
我已经尝试过了,但无法使其正常工作。到达控制器方法时,这些字段为空。
从Asp.Net Core 3.1开始,视图渲染引擎会执行此操作。当您要将模型传递给表单时,相应输入字段的名称和ID会严格保留为其模型名称。例如
public class Person
{
public string Name { get; set; }
}
将是
<input asp-for="Person.Name" id="Person.Name" name="Person.Name" />
将这种情况与您要实现的目标联系起来。您可以通过在输入类型上放置自己的ID和名称属性来覆盖此默认行为。解决您所想的方法是创建可以容纳所有这些输入的库存。当然,这就是dto的目的。
public class PersonDto
{
public string PersonName { get; set; }
}
public class GroupDto
{
public string GroupName { get; set; }
}
public class PersonGroup
{
public string PersonName { get; set; }
public string GroupName { get; set; }
}
//Then in controller
PersonDto person = auto.Map<PersonDto>(model);
GroupDto group = auto.Map<GroupDto>(model);
我不确定我是否可能不理解Formula12的答案,但是我采用了“高科技”解决方案:
结合两个视图模型:
public class GroupAndPersonViewModel
{
public string GroupName { get; set; }
public string PersonName { get; set; }
}
使用常规表单字段,无需进行任何修改:
<input asp-for="GroupName" />
<input asp-for="PersonName" />
然后在控制器中手动设置对象:
Person person = new Person()
{
Name = model.PersonName
};
Group group = new Group()
{
Name = model.GroupName
};
也许我可以做一个AutoMapper映射来进行转换,但是我认为这比在控制器中手动完成还要多。