2

我从 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"))

使用剃刀转换日期时间格式

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

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

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

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

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

源错误:

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

我刚刚开始掌握 ASP.NET 等...我不确定如何创建视图模型来尝试这个示例,因为我首先使用自动生成的 edmx 文件构建 DB:

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

有什么建议么?

目前这些工作。我要做的就是更改“更新”属性的显示格式。我的视图文件: 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
4

3 回答 3

2

试试这个:

[DisplayFormat(DataFormatString = "{0:dd MM yyyy}", ApplyFormatInEditMode = true)]
[DataType(DataType.Date)]
public DateTime Updated { get; set; }
于 2012-10-04T16:14:45.740 回答
2

具体为什么您的解决方案不起作用与错误状态完全相同。

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

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

其他人已经给出了另一种解决方案,我想解释一下为什么你的不起作用。

我刚刚开始掌握 ASP.NET 等...我不确定如何创建视图模型来尝试这个示例,因为我首先使用自动生成的 edmx 文件构建 DB

您的 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.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”赋予不同的含义,后者已在“父级或当前”范围内用于表示其他内容

当存在如下代码时:

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

所有 MVCEditForDisplayFor方法都使用一个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);
于 2012-10-04T16:16:02.460 回答
0

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

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

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

您当前使用的modelItemitem哪些不一样。

于 2012-10-04T16:14:08.420 回答