【问题标题】:ASP.NET HTML.LabelFor From Collection of ModelsASP.NET HTML.LabelFor 来自模型集合
【发布时间】:2015-08-01 08:19:15
【问题描述】:

好吧,我对 ASP.NET 4.5 很陌生(让 PHP 休息一下),并且坚持渲染标签。

我有一个 ViewModel 定义了必要的模型:

 public class TransactionsViewModel {
    public IEnumerable<Transaction> Transactions { get; set; }
    public IEnumerable<Area> Areas { get; set; }

    public IEnumerable<Mistake> Mistakes { get; set; }
    ...
 }

Transaction 只是另一个具有简单属性的模型,现在我想为其中一个 Transaction 属性显示一个标签。

我的视图具有强类型 TransactionsViewModel

@model AuditSystem.ViewModels.TransactionsViewModel

这意味着 HTMLHelper 在覆盖时具有 类型。

我试图创建的方法原型是:

public static MvcHtmlString LabelFor<TModel, TClass, TValue>(
        this HtmlHelper<TModel> helper,
        IEnumerable<TClass> model,
        Expression<Func<TClass, TValue>> expression,
        object htmlAttributes
    )

是 TransactionsViewModel(强类型), 是(Transaction)

这在尝试调用 helper.LabelFor 时会导致问题,因为它需要一个 Expression> 的表达式,但我需要传递 Func。

我尝试使用有效类型重建表达式,但在调用 html.labelfor 时卡住了,并且类型转换不起作用。

【问题讨论】:

  • 你能解释一下你期望的输出是什么。您是在尝试为集合创建标签,还是为集合中的项目创建属性。第一个没有意义,因为 &lt;label&gt; 元素与表单控件相关联(单击其设置焦点)并且您不能为集合创建表单控件
  • 我的 ViewModel 有一个事务集合。我想显示 Transaction.Property 的标签。我希望调用我的覆盖: html.labelfor(Model.Transactions, t => t.property)

标签: c# asp.net asp.net-mvc ienumerable html.labelfor


【解决方案1】:

我不确定您为什么需要覆盖 LabelFor。你可以这样尝试-

@Html.LabelFor(model=>model.Transactions.First().Property)

更新

使用 FirstOrDefault 而不是 First 以避免异常。

 @Html.LabelFor(model=>model.FirstOrDefault().Property)

【讨论】:

  • 如果 model.Transactions 为空会怎样?
  • 会抛出异常。试试@Html.LabelForm(model=>model.Transactions.FirstOrDefault().Property)
  • 是的,我不想假设事务总是包含对象,因为确实存在对象为空的情况。所以我必须重建一个将我的 TClass 更改为 TModel 的表达式,以便 Html.Labelform 可以接受它。问题将是 TModel 是 TransactionsViewModel 而 TClass 是 Transaction。
  • 是的,使用 FirstOrDefault()。即使您不将模型传递给查看,这也将起作用。
  • 我只是认为这种方法很hackish,并试图避免它。我认为最好的方法是覆盖。我正在复制一个我发现做同样事情但针对 DisplayFor 的函数。不确定谁投了反对票,但我希望他们给出一个理由?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多