1

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

编辑页面的get函数

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

html页面的缩短版本

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

json数据

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

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

我不需要在 post 函数中获取 MemberKommuns 列表。我怎样才能让活页夹在 post 函数中填充 AVC 的其余部分?

4

1 回答 1

0

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

所以为了这个工作摆脱这个元组的东西并编写一个真实的视图模型:

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

现在一切都会变得美好而美好。

于 2013-10-29T11:55:44.990 回答