【问题标题】:ASP.Net MVC 3 EditorTemplate for DateTime Fields Error日期时间字段错误的 ASP.Net MVC 3 EditorTemplate
【发布时间】:2011-06-26 22:04:48
【问题描述】:

此代码是从本教程中的一些 ASP.Net MVC 2 代码转换而来的:
MVC 2 Editor Template with DateTime

它是存储为“EditorTemplates/DateTime.cshtml”的日期时间字段的自定义 EditorTemplate。

@Model DateTime?
@Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" })

但是在使用@Html.EditorFor(model => model.NewAbsence.StartDate) 时出现以下错误:

CS1973:“System.Web.Mvc.HtmlHelper”没有名为“TextBox”的适用方法,但似乎具有该名称的扩展方法。扩展方法不能动态调度。考虑强制转换动态参数或在没有扩展方法语法的情况下调用扩展方法。

我在这里看到了一些类似的帖子,其中提到了转换 EditorFor 方法的参数,但是我似乎无法在我的示例中使用它。

谁能指出我需要在我的代码中更改什么。谢谢。

【问题讨论】:

  • 视图实际上是基于一个包含此表单的自定义数据的视图模型。该表单是一个 Create 表单,因此 model.NewAbsence 是 Absence 类型,它具有默认值。看起来部分 EditorTeplate 正在被访问,所以类型会是 DateTime??

标签: asp.net-mvc-3 razor partial-views editortemplates


【解决方案1】:

其实是@model,小写m

@model DateTime?
 ^

代替:

@Model DateTime?

【讨论】:

  • @Banford,永远不要相信 Intellisense :-)
  • 好的,所以我检查了我的其他视图,它们都是小写的。将其更改为小写以黄色突出显示该部分。但是现在代码在 EditorTemplate 的第二行出错了。说明:CS0103:名称“模型”在当前上下文中不存在 @Html.TextBox("", (model.HasValue ? model.Value.ToShortDateString() : string.Empty), new { @class= "datePicker " })
  • 是的,我猜一个相当新的技术上的智能感知不会是 100% 可靠的。 :) 好建议。
  • @Banford,在对Html.TextBox 的调用中使用大写的 M 来指代实际的模型实例。小写是用于指定模型类型的 Razor 关键字。大写是指视图基类上的属性(默认为WebViewPage)。
【解决方案2】:

所以总结一下人们在说什么,让它更通用一点。如果您的视图声明它接受动态模型:

@model dynamic

然后扩展方法之类的东西将无法推断传递给它们的参数类型。以下是两个示例(使用 Razor 是因为它很棒):

@Html.TextBox("myTextBoxName", Model.MyTextBoxValue)
@Html.DropDownList("myDropDownName", Model.MySelectList))

在这些情况下,引擎不知道 Model.MyTextBoxValue 或 Model.MySelectList 是什么类型,因此它无法确定要编译的扩展方法的重载。因此,您只需通过一些强类型来帮助它:

@Html.TextBox("myTextBoxName", (string)Model.MyTextBoxValue)
@Html.DropDownList("myDropDownName", (SelectList)Model.MySelectList))

顺便说一句,为了阻止人们拔掉头发,SelectList 必须使用以下内容正确实例化:

var items = List<SelectListItem>();
...
new SelectList(items, "Value", "Text");

【讨论】:

    【解决方案3】:

    作为我正在使用的临时解决方法:

    <div class="editor-field date-field">
        @Html.EditorFor(model => model.NewAbsence.StartDate)
        @Html.ValidationMessageFor(model => model.NewAbsence.StartDate)
    </div>
    

    然后使用 jQuery 选择器:

     $(".date-field > input").datepicker({
                    showOn: "button",
                    buttonImage: "*pathtoimage*"
                });
    

    将日期选择器应用于“日期字段”div 中的输入标签。但是,这仍然没有格式化日期值我希望它最初显示的方式,并完全删除了编辑器模板。

    【讨论】:

      【解决方案4】:

      错误消息来自您的文本框语句。在模板中,这变成了一个动态表达式,而 .Net 不知道如何键入模型属性。

      @Html.TextBox("", (string)(Model==null ? Model.Value.ToShortDateString() : string.Empty), new { style = "width: 10em;", @class="datefield" })
      

      将您的日期值显式转换为字符串,动态表达式具有所需的信息。我对 .HasValue 属性也有疑问,但这不是您的问题的重点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2016-09-30
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        相关资源
        最近更新 更多