5

カレンダーイベントオブジェクトに基づくフォームを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番目のモデルを作成する必要がありますか?それはかなり丸いようです。

4

2 に答える 2

7

ViewData["eventTypeID"]これについてもう少し考えた後、フォームを設定するコントローラーアクションだけでなく、投稿された値を受け取るコントローラーアクションにデータを入力する必要があるのではないかと思いました。私はそれを試しました、そしてそれはうまくいきました。

POSTを受け入れるコントローラーアクションが変更されました(このリストの最後の2行が追加されました)。

    [WAuthorize]
    [ValidateInput(false)]              // TODO research some more
    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateAntiForgeryToken]
    public ActionResult AddCalendarEvent(CalendarEvent newEvent)
    {
        CalendarEventTypesManager calendarEventTypesManager = new CalendarEventTypesManager();
        ViewData["eventTypeId"] = new SelectList(calendarEventTypesManager.SelectAll(), "Id", "Type");
        ....

それは私には明らかではなかったので、うまくいけば、他の誰かがこれも役立つと思うでしょう。Firefox用のLiveHTTPHeadersプラグインを使用して実際のHTTPPOSTを確認しましたが、実際にentryTypeIDは「...&entryTypeId = 2&...」として投稿されています(送信する前にフォームの2番目の項目を選択しました)が、選択リストを再読み込みしますか?投稿-検証を行うためにコントローラーに送信しますか?

于 2010-03-02T19:48:29.360 に答える
2

この問題は、ViewDataにビューのすべてのフィールドに必要な値が含まれておらず、ViewDataがビューにポストバックされた場合に発生します。

于 2010-11-18T06:09:34.737 に答える