asp.net MVC 3,Html.EditorFor在不同的Model中

时间:2012-01-29 08:10:14

标签: asp.net-mvc asp.net-mvc-3 razor html-helper

我在Model

中有2个类
public class User
{
    public int UserID { get; set; }
    public string UserName { get; set; }
}

public class Product
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

我有一个视图,使用类和我需要使用html.TextBoxFor。 我可以创建BigModel:

public class BigModel
{
    public User user;
    public Product product;
}

所以在视图中:

@model BigModel
@Html.TextBoxFor(m=> m.user.UserName)
@Html.TextBoxFor(m=> m.product.ProductName)    

或者我可以使用不同的局部视图并重新调整它们。但它们不是我最喜欢的解决方案。

还有另一种方式吗?如:

<p>    
    User Name:
    @Html.TextBoxFor<User>(u=> u.UserName)
</p>
<p>    
    Product Name:
    @Html.TextBoxFor<Product>(p=> p.ProductName)
</p>

3 个答案:

答案 0 :(得分:2)

查看TextBoxFor方法签名:

public static MvcHtmlString TextBoxFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression
)

这是不可能的。写:

@Html.TextBoxFor<Product>(p=> p.ProductName)

所以你对此感到“困惑”:

@Html.TextBoxFor(m=> m.product.ProductName)

(我不知道为什么你更喜欢第一个版本,甚至一个字符更长...... =)

答案 1 :(得分:0)

您认为您将如何获得对用户和产品的引用?泛型只显示对象的TYPE,而不是对象的实例。即便如此,也不存在那些通用版本。

我最近看到过这样的几个问题。引用完整类型有什么大不了的?为什么人们有这个问题?

如果您要传递数据视图ViewBag,那么您只需执行以下操作:

@Html.TextBoxFor(m => ViewBag.Value)

然而,这是相当愚蠢的,因为a)你失去了你的模型绑定和b)你没有获得强大的打字,所以你也可以只使用非强类型。

@Html.TextBox("Value", ViewBag.Value);

答案 2 :(得分:0)

使用C#6,您可能会考虑不使用@Html帮助程序,而只是将输入写为普通html。

例如:

<input type="text" name="@($"{nameof(BigModel.User)}.{nameof(User.UserName)})" />

当你没有使用相同的模型作为回发时,这也很方便。