ModelBinding在MVC3中的泛型类型

时间:2011-06-05 13:51:32

标签: asp.net-mvc asp.net-mvc-3 binding

在我的观看中,我使用模型的通用类型ItemModel<T>

这允许我在我的模型上有一个基本类型,它工作正常。在ItemModel<T>内,我将T的实际实体附加到名为“Item”的属性。

假设我正在加载一个用户项目:在我看来,我想做这样的事情:

<%: Html.TextBoxFor(Model => Model.Item.NickName, 
new { id="NickName", name="NickName" })%>

因为实体是通过Item属性添加的,所以这会将输入标记的name属性生成为'Item.NickName'。发布时,MVC无法再将其与控制器中用户对象的User.NickName属性相关联

public ActionResult Login(User user, string redirectUrl)

因此没有任何内容被加载到我的User对象中。有没有办法来解决这个问题?我一直在寻找编写自定义bindingmodel或valueprovider,但这看起来很像这么简单的工作。另外,我真的不确定那是不是这样。

非常感谢所有帮助!

2 个答案:

答案 0 :(得分:0)

您可以创建辅助方法来创建该文本框

public static MVCString MyTextBox<T>(this HtmlHelper html,T _item,String PropertyName)
{
  TagBuilder myTag  = new TagBuilder("input");
  myTag.Attributes("type")="Text";
  myTag.Attributes("id")=PropertyName;
  myTag.Attributes("name")=PropertyName;
  myTag.Attributes("value")=typeof(_item).GetProperty(PropertyName).GetValue(_item,null).toString();
  Return MvcHtmlString.Create(selectTag.ToString())
}

答案 1 :(得分:0)

更改动作结果的方法
public ActionResult Login(User user, string redirectUrl)

public ActionResult Login(User Item, string redirectUrl)

这样,modelbiner将能够找到以Item

为前缀的User对象的属性