【问题标题】:asp.net MVC 3, Html.EditorFor in different Modelasp.net MVC 3,不同模型中的 Html.EditorFor
【发布时间】:2012-01-29 08:10:13
【问题描述】:

我在模型中有 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>

【问题讨论】:

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


    【解决方案1】:

    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)
    

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

    【讨论】:

    • 在第二个版本中为模型添加新类:BigModel。如果我想使用它,我必须在模型中添加数十个类。
    • @MortezaTavakoli。你的模型中必须有这两个类,你认为 HTML 助手从哪里获取值?
    • 这是我页面的一部分。我通过ajax获得价值。我需要 html 助手,例如 Html.LabelFor(u=> u.UserName)。
    • @MortezaTavakoli。如果POST 出现错误,尝试的值将如何保存呈现?
    • 这不是我的问题。我通过 Ajax 正确获取和设置数据。我只需要通过 Html.LebelFor 或 Html.TextBoxFor 读取
    【解决方案2】:

    您认为您将如何获得对 User 和 Product 的引用?泛型只暴露对象的类型,而不是对象的实例。即便如此,也不存在这些的通用版本。

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

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

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

    但是这很愚蠢,因为 a) 你失去了模型绑定 b) 你没有获得强类型,所以你最好只使用非强类型。

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

    【讨论】:

    • 我通过 ViewBag 或 Ajax 获取数据。我需要 html Helper,例如:Html.LabelFor(u=> u.UserName)
    • 你没有任何意义。不,您不需要这样的 Html 助手。首先,它不存在。二是行不通。它不可能那样工作,泛型方法不能按你想要的那样工作。
    【解决方案3】:

    对于 C#6,您可能会考虑不使用 @Html 帮助器,而只是将输入编写为纯 html。

    例如:

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

    当您不使用与回发相同的模型时,这也很方便。

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      相关资源
      最近更新 更多