新手MVC通常用于隐藏和显示内容的做法

时间:2012-10-10 05:26:36

标签: asp.net-mvc razor

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

我从阅读中了解MVC的基础知识,但是在第一天我在现实世界中挣扎着可能是简单的事情,而且我也想知道如何最好地完成它们和最佳实践。

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

因此,我正在处理的第一页是搜索结果页面。它比简单的搜索页面复杂一点。如果找到拼写不正确的单词,则会有一个建议区域,如果找不到结果则有一个区域,搜索结果本身的区域(如果有)。

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

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”>
    …
</asp:Panel>
<asp:Panel ID=”panNoResults” runat=”server” Visible=”false”>
    …
</asp:Panel>
<asp:Panel ID=”panResults” runat=”server”>
    <asp:Repeater ID=”repResults” runat=”server”>
        …
    </asp:Repeater>
</asp:Panel>

在我目前的WebForms代码背后的逻辑中,我看看是否有任何拼写错误,如果是,则显示panSuggest并隐藏所有其他面板。如果没有错误,我会根据需要隐藏显示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以查看是否存在任何项目(搜索结果)。

这是一个更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

如果我有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>
    }
}

答案 1 :(得分:0)

我的方法与你的方法基本相同。我的理由是将所有业务逻辑放入控制器,并将一个简单的指示器传递给ViewBag中的视图,该视图指示用于显示数据的任何选项。通常,这将是一个简单的布尔值,例如ViewBag.Suggest值。