联合视图模型在提交后产生空字段

问题描述 投票:0回答:2

如果我有两个模型类要合并到一个通用的视图模型中,就像这样:

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

我已经尝试过了,但无法使其正常工作。到达控制器方法时,这些字段为空。

c# asp.net-core-mvc model-binding
2个回答
1
投票

从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);

0
投票

我不确定我是否可能不理解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映射来进行转换,但是我认为这比在控制器中手动完成还要多。

© www.soinside.com 2019 - 2024. All rights reserved.