MVC C# 将 linq 绑定到 sql 对象,该对象具有编辑页的一对多关系

本文关键字:对象 编辑 关系 一对多 linq 绑定 sql MVC | 更新日期: 2023-09-27 18:37:12

我有一个基本的 mvc 编辑页面,用于我的一个名为 AVC 的 linq to sql 对象,它与 MemberKommuns 有一对多关系,我想为用户显示所有 MemberKommuns 的列表,以便他们可以选择他们想要的一个。

编辑页面的获取函数

public ActionResult Edit(Guid id)
{
    AVC avc = DatabaseManager.GetAVC(id); //get avc by id
    List<MemberKommun> kommuns = DatabaseManager.GetMemberKommuns(); //get all MemberKommuns
    //turn list into list of listItems for the drop down control
    List<SelectListItem> listItems = new List<SelectListItem>();
    for (int i = 0; i < kommuns.Count; i++)
    {
        listItems.Add(new SelectListItem()
        {
            Selected = kommuns[i].Id == avc.MemberKommunId,
            Text = kommuns[i].Name,
            Value = kommuns[i].Id.ToString(),
        });
    }
    //send data to page as tuple
    Tuple<AVC, List<SelectListItem>> data = new Tuple<AVC, List<SelectListItem>>(avc, listItems);
    return View(data);
}

网页的缩短版本

@model Tuple<AVC, List<SelectListItem>>
@Html.HiddenFor(model => model.Item1.Id)
@Html.DropDownListFor(model => model.Item1.MemberKommunId, Model.Item2, new { size = 10 })
@Html.EditorFor(model => model.Item1.Name)
<input type="submit" value="Edit" />

编辑页面的发布版本。 一个虚拟函数,仅将 AVC 打印为 JSON

[HttpPost]
public string Edit(AVC viewData)
{
    return Helper.ToJson(viewData);
}

杰森数据

{ 
"Id": "3ad40e34-c660-4226-87e0-fd7c2dca0e8d", 
"MemberKommunId": "00000000-0000-0000-0000-000000000000", 
"Name": null, 
}

如 json 数据所示,id 被正确绑定,但字段的其余部分获取其默认值。在完整代码中,AVC 还有几个字段,它们都获得默认值,为了清楚起见,我删除了它们。

我不需要在帖子功能中恢复成员社区的列表。如何让活页夹在后期函数中填充 AVC 的其余部分?

MVC C# 将 linq 绑定到 sql 对象,该对象具有编辑页的一对多关系

这里的问题是您的输入字段以一些Item1Item2属性为前缀,我非常怀疑您的AVC模型中是否存在这些属性。输入字段名称以它们为前缀的原因是您使用了元组类作为视图模型。

因此,要使其正常工作,请摆脱这些元组内容并编写一个真实的视图模型:

public class MyViewModel
{
    public AVC AVC { get; set; }
    public List<SelectListItem> Items { get; set; }
}

您的控制器操作将填充:

public ActionResult Edit(Guid id)
{
    AVC avc = DatabaseManager.GetAVC(id); //get avc by id
    List<MemberKommun> kommuns = DatabaseManager.GetMemberKommuns(); //get all MemberKommuns
    //turn list into list of listItems for the drop down control
    List<SelectListItem> listItems = new List<SelectListItem>();
    for (int i = 0; i < kommuns.Count; i++)
    {
        listItems.Add(new SelectListItem()
        {
            Selected = kommuns[i].Id == avc.MemberKommunId,
            Text = kommuns[i].Name,
            Value = kommuns[i].Id.ToString(),
        });
    }
    var model = new MyViewModel();
    model.AVC = avc;
    model.Items = listItems;
    return View(model);
}

现在,可以将视图强类型化为视图模型:

@model MyViewModel
@Html.HiddenFor(model => model.AVC.Id)
@Html.DropDownListFor(model => model.AVC.MemberKommunId, Model.Items, new { size = 10 })
@Html.EditorFor(model => model.AVC.Name)
<input type="submit" value="Edit" />

您的 POST 控制器操作当然会将视图模型作为参数:

[HttpPost]
public string Edit(MyViewModel model)
{
    return Helper.ToJson(model.AVC);
}

现在一切都会束缚美好而花花公子。