2

我是一名长期的 WebForms 开发人员,但最终通过将我的一个需要更新的 WebForms 站点转换为 MVC3 来学习 MVC。

我从阅读中了解了 MVC 的基础知识,但在第一天就在现实世界中苦苦挣扎,可能很简单的事情,我也想知道如何最好地做到这一点和最佳实践。

对于这个答案,我不是在寻找代码(尽管可能会有所帮助),只是足够的信息让我走上正确的道路。我已经查看了很多示例和教程,但似乎没有一个显示与我的情况相关的内容,所以我在这里询问 SO。

因此,我正在处理的第一页是搜索结果页面。它比简单的搜索页面要复杂一些。如果它发现拼写错误的单词,它有一个建议区域,如果没有找到结果,它有一个区域,如果有的话,还有一个搜索结果本身的区域。

因为它搜索两个数据库表(实际上是视图),所以我有一个模型,它同时包含表模型和一个优先级字段,我用它来按最相关的方式对结果进行排序。模型是这样的:

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 回答