0

私はここでどうしようもなく道に迷うかもしれませんが、MVC.NET の世界から来た私には、一生これを理解することはできません。エラー メッセージは表示されませんが、フォーム送信で送信されたすべてのオブジェクト プロパティが null です。オブジェクト自体は null ではなく、プロパティのみです。

私がしたいのは、フォームが送信された後、フォーム上のチェックボックスで表される一連のオブジェクトを持つことだけです。ネストされたリストの配置のため、ご覧のとおり、少し注意が必要です。ビューは GET 要求で完全にレンダリングされますが、サーバーに投稿されるとすべてを忘れているようです。そのようなセットアップの例はありますか? 私のすべてのオブジェクトがバインディングを失う理由を誰かが提案できますか?

私のコントローラー:

@RequestMapping(value="/Search", method = RequestMethod.GET)
public String search(Model model)
{
    Period periods = new Period();

    SearchModel search = new SearchModel();
    search.periods = periods.BuildPeriodList();

    model.addAttribute("periods", periods.BuildPeriodList());
    model.addAttribute(search);

    return "search";
}

@RequestMapping(value = "/Search", method = RequestMethod.POST)
public String search(@ModelAttribute("searchModel") SearchModel search, BindingResult result)
{         
    System.out.println(Arrays.deepToString(search.periods));

    return "search";
}

私の見解:

<div id="searchPage">
<div id="searchForm">
    <form:form action="Search" method="post" modelAttribute="searchModel">
        <h2>Search</h2>
        <h2>Periods</h2>

        <c:forEach items="${periods}" var="period" varStatus="index">

            <form:checkbox path="periods[${index.count - 1}]" id="${period.name}" name="${period.name}" value="${period.name}"/>
            <label for="${period.name}">${period.displayName}</label>

            <div class="subPeriods">
            <c:forEach items="${period.subPeriods}" var="subPeriod" varStatus="subIndex">

                <form:checkbox path="periods[${subIndex.count - 1}].subPeriods" id="${subPeriod.name}" name="${subPeriod.name}" value="${period.name}"/>
                <label for="${subPeriod.name}">${subPeriod.displayName}</label>

            </c:forEach>
            </div>

        </c:forEach>
        <div class="clear"></div>
        <h2>Extras</h2>
        <form:checkbox path="hasImage" name="hasImage" id="hasImage"></form:checkbox>
        <label for="hasImage">Image</label>
        <form:checkbox path="hasPaper" name="hasPapaer" id="hasPapaer"></form:checkbox>
        <label for="hasPaper">Paper Data</label>
        <form:checkbox path="hasExtended" name="hasExtended" id="hasExtended"></form:checkbox>
        <label for="hasExtended">Extended Info</label>
        <input type="submit" name="search" value="Search"></input>
    </form:form>
</div>
<div id="searchResults">

</div>
<div class="clear"></div>

4

1 に答える 1

0

これは、一部のチェックボックスが「期間」モデルにバインドされているのに対し、他のチェックボックスは SearchModel モデルにバインドされているためです。form:checkbox 要素の path 属性は、情報をバインドする方法を示します。

これを SearchModel に含めるか、別の @ModelAttribute("periods") を POST メソッドに含めます。

1 つのモデルに固執することをお勧めします。さらに、コントローラー メソッドに複数の @ModelAttribute を含めることができるかどうかはわかりませんが、試してみてください。

于 2012-06-27T16:10:24.147 に答える