2011-02-03 55 views
18

我正在使用asp.net mvc 3,并且我不断收到此错误,但我不明白,因为我没有使用模板。当我尝试这样做时,获取模板错误?

我在视图模型

public class FormViewModel 
    { 
     public DateTime Due { get; set; } 


     public FormViewModel() 
     { 
      DueDate = DateTime.UtcNow;   
     } 
    } 

有这在我的部分观点

@model ViewModels.FormViewModel 

    <div="tabs-1"> 
     @Html.TextBoxFor(x => x.Due.ToShortDateString()) 
    </div> 

,我得到这个错误

模板只能与现场 接入一起使用,财产访问, 单维数组索引或 单电子参数自定义索引器 表达式。说明: 执行当前Web请求期间发生未处理的 异常。 请查看堆栈跟踪以获取更多有关该错误的信息,以及 源于代码的更多信息 。

异常详细信息: System.InvalidOperationException: 模板只能与现场 访问,属性访问, 一维数组的索引,或者 单参数定制索引 表达式中使用。

回答

51

应该是这样的:

@Html.TextBoxFor(x => x.Due) 

如果你想在这个日期一些格式:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
public DateTime Due { get; set; } 

然后:

@Html.EditorFor(x => x.Due) 
的,如果你真的想

要使用此.ToShortDateString()方法,您需要使用非强类型PED助手(显然这件事情我不推荐):

@Html.TextBox("Due", Model.Due.ToShortDateString()) 
+1

@Darin Dimitrov - 好吧我认为我在那里使用了一个坏例子,因为它反正呈现为字符串。说如果我想使用“ToShortDateString()”为什么我不能使用它? – chobo2 2011-02-03 22:10:17

+0

@ chobo2,你可以使用`DisplayFormat`属性和`Html.EditorFor`助手指定格式。 – 2011-02-03 22:11:23

+0

@Darin Dimitrov - 所以我用什么被认为是模板?因此,任何助手都是模板,并且要改变它们,我要么像Tomas Lycken所说的那样编辑它们,要么使用数据注释来执行外观? – chobo2 2011-02-03 22:18:50

5

你因为.TextBoxFor() HTML辅助使用内置的模板(一个用于字符串输入文本框)得到的错误,而你给它是一个太复杂的lambda表达式(即,不属于消息中列出的一组类型)。

要解决此问题,请将要编辑的属性的类型更改为string,以便MVC可以使用默认的字符串模板,或者让MVC使用默认的日期时间模板。我建议后者:

@Html.TextBoxFor(m => m.Due) 

如果你不快乐与您的用户被要求修改日期的方式,放在〜/查看/共享/ EditorTemplates名为“DateTime.cshtml”的局部视图你在哪里编辑编辑器,以便按照你想要的方式工作。

5

如果您正在使用MVC,并有一个内嵌代码元素,可以尝试设置参数,像这样 -

@{ 
string parameterValue = DateTime.Parse(@item.Value).ToShortDateString(); 

} 

@Html.DisplayFor(model => parameterValue) 
6

存在过载,可以帮助实现这一目标,同时保持强类型。

// Specify that you're providing the format argument (string) 
@Html.TextBoxFor(x => x.Due, format: Model.Due.ToShortDateString()) 

// Or use the overload with format and html options, where null is the htmloptions 
@Html.TextBoxFor(x => x.Due, Model.Due.ToShortDateString(), null) 
0

您正在通过的textboxfor参数传递的方法,而不是通过一个表达误导应用。

您有:

@Html.TextBoxFor(x => x.Due.ToShortDateString()) 

存储你的结果在一个变量,然后使用表达式。尝试这种

var shortDate = Model.Due.ToShortDateString(); 
@Html.TextBoxFor(x => shortDate) 
0

代替在模型中使用@Value注解如下添加格式的

@ Html.TextBoxFor(X => x.Due新{@值= Model.Due.ToShortDateString()})

相关问题