2012-01-29 30 views
2

我有2类模型asp.net MVC 3,Html.EditorFor在不同型号

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)  

或者我可以使用不同的局部视图和reander他们。但他们并不是我最喜欢的解决方案。

难道没有其他办法吗?例如:

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

回答

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) 

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

+0

在第二个版本中添加新的类到模型:BigModel。如果我想使用它,我必须添加几十个类到模型。 – Morteza 2012-01-29 08:35:38

+0

@MortezaTavakoli。你必须在模型中拥有这两个类,你认为HTML帮助器从哪里获取值? – gdoron 2012-01-29 08:37:39

+0

这是我的网页的一部分。我通过ajax获得价值。我需要html助手,如Html.LabelFor (u => u.UserName)。 – Morteza 2012-01-29 08:51:07

0

您如何确切地得到对用户和产品的引用?泛型只暴露对象的类型,而不暴露对象的实例。即便如此,也不存在通用版本。

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

如果你是通过你的数据视图ViewBag,那么你可以简单地这样做:

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

但是这是相当愚蠢的,因为一)你失去了你的模型绑定和b)你是不是越来越强类型,所以你不妨使用非强类型。

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

我通过ViewBag或Ajax获取数据。我需要html助手,如:Html.LabelFor (u => u.UserName) – Morteza 2012-01-29 08:53:15

+1

你没有任何意义。不,你不需要像这样的Html帮手。首先,它不存在。其次,它不能工作。它不可能以这种方式工作,通用方法无法按照您的需要运行。 – 2012-01-29 09:49:32

0

对于C#6,您可能会考虑不使用@Html帮助程序,而只是将输入内容写为纯HTML。

例如:

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

此当你不使用相同的模型得到的回传也很方便。