我是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以查看是否存在任何项目(搜索结果)。
这是一个更好的解决方案吗?
答案 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值。