6

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

它是存储为“EditorTemplates/DateTime.cshtml”的 DateTime 字段的自定义 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 方法的参数,但是我似乎无法在我的示例中使用它。

有人可以指出我需要在我的代码中更改什么。谢谢。

4

4 回答 4

11

实际上它是@model小写的m

@model DateTime?
 ^

代替:

@Model DateTime?
于 2011-02-14T21:49:36.830 回答
4

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

@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");
于 2011-02-24T21:20:42.620 回答
0

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

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

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

于 2011-02-21T02:01:16.203 回答
0

作为临时工作,我正在使用:

<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 中的输入标签。但是,这仍然没有格式化我希望它最初显示的日期值,并完全删除了编辑器模板。

于 2011-02-14T16:01:00.143 回答