通过选项/选择元素发布复杂类型

时间:2012-11-09 14:39:40

标签: c# asp.net-mvc

可以传递类别模型(下面给出的示例)

public class Category { 
     public Guid Id { get; set; }; 
     public String Title { get; set; }
}

使用select / option?

<select id="categories" name="Category">
    <option value="Id">Text</option>
</select>

据我了解,这将正常绑定但不包括Title属性?

修改

Viewmodel

public class EditProductModelView { 
    [Required] Category Category { get; set; }
    // other properties
}

Controller

public ActionResult Edit(EditProductViewModel model) {
    // controller logic
}

谢谢!

3 个答案:

答案 0 :(得分:1)

为了绑定,我相信你必须命名select元素Id

<select id="categories" name="Id">
    <option value="foo">Text</option>
    <option value="bar">Text</option>
</select>

如果你的行动看起来像这样:

public ActionResult YourAction(Category model) {
    var modelId = model.Id; // Will be set to the chosen value
    var title = model.Title; // Will be null
}

答案 1 :(得分:1)

您可以为标题值添加隐藏输入,并在选择选项更改时用数据标题属性值填充选项

<input id="categoriesTitle" type="hidden" name="Category.Title" />
<select id="categories" name="Category.Id">
    <option value="foo" data-title="this is foo">foo</option>
    <option value="bar" data-title="I am bar">bar</option>
</select>

答案 2 :(得分:1)

您的模型需要一个位置来获取所选的ID,这是您放置所需属性的位置

public class EditProductModelView { 
      [Required]
     public Guid SelectedCategoryId {get;set;}
}

然后name必须与视图模型中的属性名称匹配:

<select id="categories" name="SelectedCategoryId">
    <option value="SomeGuidHere">Text</option>
</select>

这只是因为浏览器处理帖子的方式。它们不发布Text节点,只发布选定的值,在您的情况下是Id。