[英]Html.DisplayFor doesn't return value on submit using it in mvc 4 Razor view
[英]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"))
但是,这会产生以下错误:
“ /”应用程序中的服务器错误。
模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用。
说明:执行当前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.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”已在“父项或当前”范围中用于表示其他内容
当代码如下时:
@foreach (var item in Model) // or Model.Items
{
<div>
@Html.DisplayFor(item => item.Updated)
</div>
}
所有MVC EditFor
和DisplayFor
方法都使用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时,需要在=>
符号之前和之后匹配符号名称。
您当前正在使用不相同的modelItem
和item
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.