cho*_*bo2 18 c# asp.net-mvc asp.net-mvc-3
我正在使用asp.net mvc 3并且我一直收到此错误,因为我没有使用模板,所以我不理解它.
我在局部视野中有这个
@model ViewModels.FormViewModel
<div="tabs-1">
@Html.TextBoxFor(x => x.Due.ToShortDateString())
</div>
Run Code Online (Sandbox Code Playgroud)
在我的viewmodel中
public class FormViewModel
{
public DateTime Due { get; set; }
public FormViewModel()
{
DueDate = DateTime.UtcNow;
}
}
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.InvalidOperationException:模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式.
Dar*_*rov 51
应该是这样的:
@Html.TextBoxFor(x => x.Due)
Run Code Online (Sandbox Code Playgroud)
如果你想要这个日期的格式:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime Due { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后:
@Html.EditorFor(x => x.Due)
Run Code Online (Sandbox Code Playgroud)
如果你真的想要使用这种.ToShortDateString()方法,你需要使用非强类型的帮助器(显然这是我建议反对的):
@Html.TextBox("Due", Model.Due.ToShortDateString())
Run Code Online (Sandbox Code Playgroud)
有一个重载可以帮助实现这一点,同时保持强类型.
// 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)
Run Code Online (Sandbox Code Playgroud)
你得到错误是因为.TextBoxFor()html帮助器使用的是内置模板(字符串输入的文本框),并且你给它一个太复杂的lambda表达式(即不属于列出的类型集)消息).
要解决此问题,请将要编辑的属性的类型更改为a string,以便MVC可以使用默认字符串模板,或者让MVC使用默认的日期时间模板.我推荐后者:
@Html.TextBoxFor(m => m.Due)
Run Code Online (Sandbox Code Playgroud)
如果您对用户被要求编辑日期的方式不满意,请在〜/ Views/Shared/EditorTemplates中放置一个名为"DateTime.cshtml"的部分视图,您可以在其中构建编辑器,使其按您希望的方式工作.
小智 5
如果您使用MVC并具有内联代码元素,请尝试设置如下参数 -
@{
string parameterValue = DateTime.Parse(@item.Value).ToShortDateString();
}
@Html.DisplayFor(model => parameterValue)
Run Code Online (Sandbox Code Playgroud)