2

我创建了一个包含其他复杂类对象的类。

所以例如

class A {

    public int ID { set; get; }

    public string MyObjectName {set; get; }

    public B ObjectOfTypeB { set; get; }

}

class B {

    public int ID { set; get; }

    public int CategoryNumber { set; get; }

    public string CategoryDescription { set; get; }

}

现在我有一个创建 A 类型对象的控制器方法。我为创建模型(A 类)搭建了一个视图。但是因为 A 拥有一个复杂类型,它不知道如何为 B 类型创建输入字段。

在我的创建功能

// helper method to get a list of the possible B objects - 
// this method will eventually query a database. for now just static objects

private List<Category> getBobjects()
{
    List<B> bs = new List<B>();
    bs.Add(new B() { ID = 1, CategoryNumber = 2, CategoryDescription = "Config 1" });
    bs.Add(new B() { ID = 2, CategoryNumber = 3, CategoryDescription = "Config 2" });
    return bs;
}

[HttpGet]
public ActionResult Create()
{
    // Adding to the view bags the categories to display
    ViewBag.bs = getBobjects();
    return View();
}

在视图中

@Html.DropDownListFor(model => model.ObjectOfTypeB, 
       new SelectList(ViewBag.bs, "ID", "CategoryDescription"))

我假设在提交表单时,来自 ObjectOfTypeB 的数据将绑定到类型 A 的回发对象。但这并没有发生。

谁能解释我如何将特定字段的可能值列表传递给视图并让回发将值绑定到返回的对象上?

[错误打印屏幕][1]

4

4 回答 4

1

您的绑定不正确。如果您尝试填充ID您的ObjectOfTypeB财产,那么您DropDownListFor应该绑定到model => model.ObjectOfTypeB.ID

如果您查看源代码,您的源代码应该看起来像<select name="ObjectOfTypeB.ID">您希望它在回发时自动填充该属性。

在这种情况下,我可能会使用 ViewModel (VM) 来表示您的模型。您并没有真正填写完整的对象 B,因为 B 包含与所选 ID 相关的类别和描述——换句话说,这三个属性绑定在一起,不能单独填写。

我会做类似的事情:

class AViewModel
{
    public int ID {set;get;}

    public string MyObjectName {set; get;}

    public int IDofB { set; get; }
}

为了让您更轻松地在 A 和 AViewModel 之间进行转换,请查看 AutoMapper 等工具。

于 2013-01-02T16:12:32.443 回答
0

我为那个复杂的类类型模型创建了一个视图模型

每个嵌套对象都有一个键,并且这些键使用来自引用对象类型的选择列表来显示文本。

之后在回帖中,我将视图模型翻译回模型的类型

于 2013-01-16T10:46:22.713 回答
0
  private IList getBobjects()
        {
        List<B> bs = new List<B>();
        bs.Add(new B() { ID = 1, CategoryNumber = 2, 
             CategoryDescription = "Config 1" });
        bs.Add(new B() { ID = 2, CategoryNumber = 3, 
             CategoryDescription = "Config 2" });
        return bs;
        }

    public IList<SelectListItem> GetDropdownlistItems()
    {
        IList<SelectListItem> ilSelectList = new List<SelectListItem>();

        IList objlist = getBobjects();
        foreach (object[] arrobject in objlist)
        {
            SelectListItem selectListItem = new SelectListItem();
            selectListItem.Value = arrobject[0].ToString();
            selectListItem.Text = arrobject[1].ToString();
            ilSelectList.Add(selectListItem);
        }

        return ilSelectList;
    }

    public ActionResult Create()
    {
        IList<SelectListItem> ilSelectListItems = GetDropdownlistItems();
        ViewBag.bs = ilSelectListItems;
        return View();
    } 

并认为:

@Html.DropDownList("bs", new SelectList(ViewBag.bs, "Text", "Value"))

希望这会有所帮助,谢谢。

于 2013-01-02T17:12:28.077 回答
0

您必须ViewBag再次填写才能将绑定返回到您的View. 您可以创建一个为您填充此 ViewBag 的方法,并将其用于 get/post 方法的添加/编辑。尽量让你的ViewModels(我喜欢称之为 as InputModel)只使用原始类型(string, int, double, bool),换句话说,将 B 复杂类型更改为 a int。尝试这样的事情:

private void SetViewBagCombo(int selectedValue = 0)
{
   ViewBag.bs = new SelectList(getBobjects(), "Id", "CategoryDescription", selectedValue);
}

public ActionResult Create()
{
   SetViewBagCombo(); 
   return View();   
}

[HttpPost]
public ActionResult Create(A input)
{
   if (ModelState.IsValid)
   {
      // persist it
      return RedirectToAction("Index");
   }

   SetViewBagCombo(input.B.Id); 
   return View();   
}

在你看来:

@Html.DropDownListFor(model => model.IdOfB, (SelectList)ViewBag.bs, "Select...")
于 2013-01-02T16:18:53.477 回答