2

私は長年のWebForms開発者ですが、更新が必要なWebFormsサイトの1つをMVC3に変換することで、ようやくMVCの学習に取り掛かっています。

私はMVCの基本を読むことで知っていますが、初日はおそらく単純なことで現実の世界で苦労しています。また、それらを実行するための最善の方法とベストプラクティスについても知りたいと思います。

この答えのために、私はコードを探していません(少しは役立つかもしれませんが)、正しい道に私を置くのにちょうど十分な情報です。私はすでにかなりの数の例とチュートリアルを見てきましたが、どれも私の状況に関連する何かを示していないようですので、ここで私はSOについて尋ねています。

ですから、私が取り組んでいる最初のページは検索結果ページです。単純な検索ページよりも少し複雑です。スペルが間違っている単語が見つかった場合の提案用の領域、結果が見つからなかった場合の領域、および検索結果自体の領域(存在する場合)があります。

2つのデータベーステーブル(実際にはビュー)を検索するため、テーブルモデルと、結果を最も関連性の高い順に並べ替えるために使用する優先度フィールドの両方を含むモデルがあります。モデルは次のようになります。

public class SearchResult
{
    public Table1 { get; set; }
    public Table2 { get; set; }
    public int Priority { get; set; }
}

WebFormsでは、パネルを使用して各領域を含め、次のようにオンとオフを切り替えます。

<asp:Panel ID=”panSuggest” runast=”server” Visible=”false”&gt;
    …
</asp:Panel>
<asp:Panel ID=”panNoResults” runat=”server” Visible=”false”&gt;
    …
</asp:Panel>
<asp:Panel ID=”panResults” runat=”server”&gt;
    <asp:Repeater ID=”repResults” runat=”server”&gt;
        …
    </asp:Repeater>
</asp:Panel>

ロジックの背後にある現在のWebFormsコードでは、スペルミスがないかどうかを確認し、ある場合はpanSuggestを表示して、他のすべてのパネルを非表示にします。エラーがない場合は、必要に応じてshow panResults/panNoResultsを非表示にします。

では、この種のことは通常MVCでどのように行われるのでしょうか?コントローラーでViewBagアイテムを設定して、ビューで探しているPanSuggestを表示するかどうかを設定し、それに基づいて非表示/表示を選択し、モデルにアイテムがあるかどうかを確認して、panResults /panNoResultsを表示するかどうかを決定しますか? 。以下の私のコードのようなものですか、それともこれはそれを行うための適切な方法ではありませんか?

@{ if (ViewBag.Suggest == true) {
    <div>
        Suggest
    </div>
} else {
    @{ if (Model.Count == 0) {
        <div>
            No Results
        </div>
 } else {
        <div>
            @foreach (var result in Model) {
                @result.Table1.Whatever etc etc
            }
        </div>
 }
}

アップデート。

私はもっ​​と読んでいて、ViewBagを避けるためのアドバイスがたくさんあります。

代わりに、必要な追加データを含めるようにモデルを変更する必要がありますか?このようなもの

Public class ViewModel
{
    public string Suggest { get; set; }
    public List<SearchResult> Result { get; set; }
}

public class SearchResult 
{ 
    public Table1 { get; set; } 
    public Table2 { get; set; } 
    public int Priority { get; set; } 
} 

次に、私のビューで、ViewModel.Suggestが空でないかどうかを確認し、ViewModel.Resultをチェックして、アイテム(検索結果)が存在するかどうかを確認できます。

これはより良い解決策ですか?

4

2 に答える 2

5

表示する必要のある2つの異なるテーブルがある場合、同じように変更します。変更するのは

@{
    if (ViewBag.Suggest == true) 
    {
        <div>
            Suggest
        </div>
    } else {
        <table>
            <thead>
                <th>Header column</th>
            </thead>
            <tbody>
            @{ if (Model != null && Model.Any()) {
                <tr>
                @foreach (var result in Model) 
                {
                    <td>
                        @result.Table1.Whatever etc etc
                    </td>
                }
                </tr>
            } else {
                <tr>
                    <td>
                        No Results
                    </td>
                </tr>
            }
            </tbody>
        </table>
    }
}
于 2012-10-10T06:47:35.240 に答える
0

私のアプローチは基本的にあなたのアプローチと同じです。私の理論的根拠は、すべてのビジネスロジックをコントローラーに配置し、データを表示するためのオプションを示す単純なインジケーターをViewBagのビューに渡すことです。通常、これはViewBag.Suggest値などの単純なブール値になります。

于 2012-10-10T08:59:23.457 に答える