【问题标题】:Get a template error when I try to do this?尝试执行此操作时出现模板错误?
【发布时间】:2011-02-03 22:02:41
【问题描述】:

我正在使用 asp.net mvc 3,但我一直收到此错误,我不明白,因为我没有使用模板。

我的部分观点是这样的

@model ViewModels.FormViewModel

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

在我的视图模型中

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


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

我得到了这个错误

模板只能与字段一起使用 访问,财产访问, 一维数组索引,或 单参数自定义索引器 表达式。描述:一个未处理的 期间发生异常 执行当前的 Web 请求。 请查看堆栈跟踪以获取更多信息 有关错误和位置的信息 它起源于代码。

异常详情: System.InvalidOperationException: 模板只能与字段一起使用 访问,财产访问, 一维数组索引,或 单参数自定义索引器 表达式。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    应该是这样的:

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

    如果你想要这个日期的某种格式:

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

    然后:

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

    如果你真的想使用这种.ToShortDateString() 方法,你需要使用非强类型帮助器(显然我不建议这样做):

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

    【讨论】:

    • @Darin Dimitrov - 好的,我想我在那里使用了一个不好的例子,因为无论如何它都会被渲染为字符串。说如果我想用“ToShortDateString()”为什么我不能用呢?
    • @chobo2,您可以使用DisplayFormat 属性和Html.EditorFor 助手指定格式。
    • @Darin Dimitrov - 所以我使用的是模板吗?所以任何 for 助手都是模板,要改变它们,我要么像 Tomas Lycken 说的那样编辑它们,要么使用数据注释来做外观?
    • @chobo2, EditorFor 用于您可以覆盖的模板,它将使用您模型属性上的任何属性,例如 DisplayFormat。 TextBoxFor 将始终生成文本框输入。两者都采用 lambda 表达式。此 lambda 表达式应仅返回模型上的属性。你不能调用任何方法。最后一个选项(自 ASP.NET MVC 1 以来就存在的选项)是使用非强类型帮助器,您可以在其中硬编码名称和值。
    • @chobo2,不同之处在于模板自动处理复杂对象层次结构中输入字段的命名。它们还与集合属性一起使用,因此您不必在视图中编写循环。模板会自动应用于集合的每个元素,使您的视图代码非常简洁。
    【解决方案2】:

    有一个重载可以帮助实现这一点,同时保持强类型。

    // 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)
    

    【讨论】:

      【解决方案3】:

      您收到错误是因为 .TextBoxFor() html 帮助程序使用内置模板(用于字符串输入的文本框),并且您给它的 lambda 表达式太复杂(即不属于消息中列出的类型集)。

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

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

      如果您对要求用户编辑日期的方式不满意,请在 ~/Views/Shared/EditorTemplates 中放置一个名为“DateTime.cshtml”的局部视图,您可以在其中构建编辑器,使其按照您的方式工作想要。

      【讨论】:

      • @ Tomas Lycken - 在我开始使用剃须刀之前,我不记得它有问题吗?如果我自己建造,那么所有日期都会得到这个?即使是我不想的?例如,如果我只希望其中一个日期具有 ToShortDateString() 而所有其他日期都像默认值一样呈现,可以这样做吗?
      • @Tomas Lycken - 所以我做的事情太复杂了?它不会先将其转换为字符串然后将其放入文本框中吗?我在哪里可以阅读更多关于此的信息(关于这些文本框可以处理的内容)它看起来很奇怪
      • @chobo2: 问题不在于 render 是一件非常复杂的事情 - 只是与 ViewModel 属性的名称挂钩(即用于输入字段的name 属性)一旦您允许比错误消息中列出的更深层次的语句,就会变得更加复杂。如果您想影响日期的输出,请使用 [DisplayFormat] 属性(或其他可用属性之一),或创建您自己的模板。
      【解决方案4】:

      如果你使用 MVC 并且有内联代码元素,请尝试设置这样的参数 -

      @{
      string parameterValue = DateTime.Parse(@item.Value).ToShortDateString();
      
      }
      
      @Html.DisplayFor(model => parameterValue)
      

      【讨论】:

      • 我不需要 DateTime.Parse 只是简单地 string datevalue = item.LastUpdate.ToShortDateString();
      【解决方案5】:

      您通过在textboxfor 的参数中传递方法而不是传递表达式来误导应用程序。

      你有:

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

      将结果存储在变量中,然后使用表达式。试试这个

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

      【讨论】:

        【解决方案6】:

        而不是在模型中添加格式使用@Value注释如下

        @Html.TextBoxFor(x => x.Due new {@Value=Model.Due.ToShortDateString()})

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-15
          相关资源
          最近更新 更多