カレンダーイベントオブジェクトに基づくフォームをASP.NETMVC2RC2で作成しようとしています。オブジェクトには、選択リストを介して入力する必要があるSystem.Int32であるeventTypeIdがあります。
初期ビューを作成するコントローラーは次のとおりです。
[WAuthorize]
public ActionResult AddCalendarEvent()
{
CalendarEventTypesManager calendarEventTypesManager =
new CalendarEventTypesManager();
ViewData["eventTypeId"] = new SelectList(
calendarEventTypesManager.SelectAll(), "Id", "Type");
return View();
}
ビューのスニペット(ヘッダー付き)は次のとおりです。
<%@ Page Title="" Language="C#"
MasterPageFile="~/Views/Shared/Site.Extranet.master"
Inherits="System.Web.Mvc.ViewPage<SomeProject.Models.CalendarEvent>" %>
...
<p><%= Html.DropDownList("eventTypeId") %></p>
これにより、次のHTMLが生成されます。
<p>
<select id="eventTypeId" name="eventTypeId">
<option value="1">All school activities</option>
<option value="2">All school event</option>
</select>
</p>
POSTを受け入れるコントローラーは次のとおりです。
[WAuthorize]
// TODO research some more
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult AddCalendarEvent(CalendarEvent newEvent)
{
...
[Bind (Exclude="eventTypeId")]
( 「CalendarEventnewEvent」パラメーターの前に追加しようとしましたが、動作は変わりません。)
問題:フォームを送信すると、InvalidOperationException例外が発生します。
キー「eventTypeId」を持つViewDataアイテムのタイプは「System.Int32」ですが、タイプは「IEnumerable<SelectListItem>」である必要があります。
こことMVCブログでいくつかの例を見てきましたが、これまでのところ、これがどのように機能するかは明確ではありません(多くの例に基づくと、そのまま機能するはずです)。SelectListItemを受け入れ、その値をSystem.Int32に変換して実際にeventTypeIdを設定するには、SelectListItem型の変数を持つ2番目のモデルを作成する必要がありますか?それはかなり丸いようです。