2011-02-14 73 views
6

此代碼由一些ASP.Net MVC 2代碼在這個教程轉換:
MVC 2 Editor Template with DateTimeASP.Net MVC 3 EditorTemplate爲日期時間字段錯誤

它是被存儲爲「EditorTemplates /日期時間日期時間字段的自定義EditorTemplate .cshtml」。

CS1973:

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

但是使用@Html.EditorFor(model => model.NewAbsence.StartDate)當我得到以下錯誤「System.Web.Mvc.HtmlHelper」有一個名爲「文本框」不適用的方法,但似乎有通過一個擴展方法名稱。擴展方法不能動態分派。考慮轉換動態參數或調用擴展方法而不使用擴展方法語法。

我在這裏看到了一些類似的帖子,提到了鑄造EditorFor方法的參數,但是我似乎無法得到這個在我的例子中工作。

有人請指出我需要改變我的代碼。謝謝。

+0

什麼類型是「Model」? – SLaks 2011-02-14 13:24:08

+0

該視圖實際上基於包含此表單的自定義數據的ViewModel。表單是一個Create表單,所以model.NewAbsence的類型爲Absence,它具有默認值。它看起來像部分EditorTeplate被訪問,所以類型會有DateTime? – Banford 2011-02-14 13:57:09

回答

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*" 
      }); 

申請日期選取器的輸入標籤「日場」專區內。但是,這仍然沒有格式化日期值,我最初希望它顯示,並完全刪除編輯器模板。

11

其實這是@model小寫m

@model DateTime? 
^ 

代替:

@Model DateTime? 
0

錯誤消息來自您的文本框聲明。在模板中,這變成了一個動態表達式,並且.Net不知道如何輸入模型屬性。

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

顯式地將您的日期值轉換爲字符串,並且動態表達式具有所需的信息。 .HasValue屬性也有問題,但這不是你問題的要點。

4

因此,總結一下人們在說什麼,並使其更通用一些。如果你的觀點是聲明它接受動態模型:

@model dynamic 

然後像擴展方法的東西將無法推斷傳遞給它們的參數的類型。這裏有兩個例子(使用剃刀,因爲它的真棒):

@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");