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 的其余部分?
这里的问题是您的输入字段以一些Item1
和Item2
属性为前缀,我非常怀疑您的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);
}
现在一切都会束缚美好而花花公子。