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

时间:2012-10-04 16:06:33

标签: c# asp.net-mvc razor

我以hh:mm dd/mm/yyyy

格式从SQL db中提取日期时间

使用Razor语法,我可以使用

显示存储在DB中的日期
@Html.DisplayFor(modelItem => item.Updated)

我希望Razor能够以下列格式显示dd MMM yyyy所以我按照另一个StackOverflow回答尝试了以下内容:

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

Converting DateTime format using razor

然而,这会产生以下错误:

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

     

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

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.InvalidOperationException:模板可以   仅用于字段访问,属性访问,单维数组   索引或单参数自定义索引器表达式。

     

来源错误:

     

第36行:第37行:第38行:
  @ Html.DisplayFor(modelItem =&gt; 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 =&gt;的人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

3 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:2)

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

  

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

所以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 } 
}

实体框架默认创建Partial Classes,代表您选择的表格。这意味着您可以在另一个文件中定义另一个分部类,.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.Name上不存在IEnumerable,它存在于IEnumerable的元素中。

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

错误更新

  

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

当代码存在时,如下所示:

@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);

答案 2 :(得分:0)

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

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

使用lambdas时,您需要匹配=>符号前后的符号名称。

您目前使用的modelItemitem不相同。