繁体   English   中英

IEnumerable类型的视图模型的Razor语法 <T> 用于DisplayFor

[英]Razor syntax for view models of type IEnumerable<T> for DisplayFor

我从SQL db中提取日期时间,格式为hh:mm dd/mm/yyyy

使用Razor语法,我可以使用以下命令显示存储在数据库中的日期:

@Html.DisplayFor(modelItem => item.Updated)

我希望Razor以以下格式显示dd MMM yyyy所以我尝试了另一个StackOverflow答案:

@Html.DisplayFor(modelItem => item.Updated.ToString("dd MMM yyyy"))

使用剃须刀转换DateTime格式

但是,这会产生以下错误:

“ /”应用程序中的服务器错误。

模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用。

说明:执行当前Web请求期间发生未处理的异常。 请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.InvalidOperationException:模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用。

源错误:

第36行:第37行:第38行:
@ Html.DisplayFor(modelItem => item.Updated.ToString(“ dd MMM yyyy”))第39行:第40行:

我只是开始接触ASP.NET等...,而且我不确定如何创建视图模型来尝试此示例,因为我首先使用自动生成的edmx文件来构建数据库:

[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")] 
pubilc DateTime Updated { get; set } 

有什么建议么?

目前这些工作。 我要做的就是更改“ updated”属性的显示格式。 我的查看文件: http : //pastebin.com/Ywn8Z0TV

我的控制器: http : //pastebin.com/1jAih6AE

我的型号: http//pastebin.com/UC61QjFZ

更新:对于那些您说应该是item => item.Updated ...的人

Error   1   A local variable named 'item' cannot be declared in this scope because it would give a different meaning to 'item', which is already used in a 'parent or current' scope to denote something else

尝试这个:

[DisplayFormat(DataFormatString = "{0:dd MM yyyy}", ApplyFormatInEditMode = true)]
[DataType(DataType.Date)]
public DateTime Updated { get; set; }

具体来说,您的解决方案不起作用的原因与错误状态完全相同。

模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用。

因此ToString()是一种方法,不适用于模板。

其他人已经提供了替代解决方案,我想解释一下您的为什么不起作用。

我刚开始接触ASP.NET等...并且我不确定如何创建视图模型来尝试此示例,因为我首先使用自动生成的edmx文件来构建数据库

您的edmx文件应创建一个看起来也类似的类:

public partial class SomeTable
{
  public DateTime Updated { get; set } 
}

在同一项目中,在相同的NameSpace(不一定是目录)中,创建一个名为SomeTable.Partial.cs的文件,该文件看起来也类似:

public partial class SomeTable
{
  [DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")] 
  pubilc DateTime Updated { get; set } 
}

默认情况下,实体框架会创建表示您选择的表的部分类 这意味着您可以在另一个文件中定义另一个局部类,并且.Net在编译时会将每个属性的所有属性组合为一个属性。

更新

这段代码对我来说看起来很奇怪,我不知道它如何工作:

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Metal.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Currency.Code)

更新2

DisplayFor用于显示模型上的属性(并且仅直接显示模型上的属性)。 当您枚举IEnumerable<>类型的模型(或模型上的属性)时,您将无法再使用DisplayFor显示这些值。 您应该改用Display 例如, Metal.NameIEnumerable上不存在,它存在于IEnumerable的元素中。

@foreach (var item in Model) {
<tr>
    <td>
        @Html.Display(item.Metal.Name)
    </td>
    <td>
        @Html.Display(item.Currency.Code)

错误更新

错误1无法在此范围内声明名为“ item”的局部变量,因为它将赋予“ item”不同的含义,“ item”已在“父项或当前”范围中用于表示其他内容

当代码如下时:

@foreach (var item in Model) // or Model.Items
{
  <div>
  @Html.DisplayFor(item => item.Updated)
  </div>
}

所有MVC EditForDisplayFor方法都使用Expression<TDelegate>因此,当代码声明DisplayFor(item => item.Updated) ,第一item基本上是定义变量T item但是您不能再次定义相同的变量名。 为了说明这不是MVC特有的,它也不会编译并给出相同的错误(对于相同变量名的声明更明显):

var item = 1;
var items = new List<int>() { 1, 2, 3, 4};
var sameItem = items.Select(item => item == item);

尝试以下方法。 似乎您使用不正确的语法调用DisplayFor方法。

@Html.DisplayFor(x => x.Updated)

使用lambda时,需要在=>符号之前和之后匹配符号名称。

您当前正在使用不相同的modelItemitem

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM