ASP.Net MVC框架和数据绑定

时间:2008-11-11 15:07:11

标签: .net asp.net-mvc

我在掌握MVC框架背后的一些概念时遇到了一些麻烦。我正在做一个非常简单的应用程序,它对产品进行分类。

创建屏幕将只显示一个下拉列表,显示类别列表,产品名称并提交。

在普通的.Net应用程序上,我会在Page_Load中对数据库下拉列表进行数据绑定,但在MVC应用程序中,从数据库中检索我的类别并将其添加到下拉列表的最佳方法是什么?

(抱歉,我的问题极其荒谬,但遗憾的是MVC上的资源很多,而且由于早期的变化,示例经常被打破)

2 个答案:

答案 0 :(得分:4)

我不确定我是否完全掌握,但如果您的页面显示单个产品且唯一的用户输入只是从下拉列表中选择一个类别,我可以帮助排序(但我是一个菜鸟太!)。

参考此页面:

http://weblogs.asp.net/scottgu/archive/2008/05/27/asp-net-mvc-preview-3-release.aspx

您将要在控制器中为类别创建一个SelectList(可能引用ID,并显示名称)。然后,将此SelectList添加到ViewData。您也可以将其设置为ViewData.Model的一部分,并从View中引用它。

在您的视图中,您使用HtmlHelper for DropDownList将SelectList作为参数。

上面的链接应该更好地传达它,这只是一个简短的总结。该链接用于预览3,但我认为它应该仍然适用。

答案 1 :(得分:0)

您的模型检索数据,您的演示者组织视图的数据,以及视图控件将模型绑定到UI元素。例如,这是LogEvent的模型:

public class LogEvent{
  public string Title {get;set;}
  public string Date {get;set;}
  public string Message {get;set;}

  // this is for example only; you would most likely bind directly against the host.GetAllLogs() result
  public static IEnumerable<LogEvent> RetrieveAllLogs(ILogProvider host){
    return from x in host.GetAllLogs() select new LogEvent(x.LogTitle, x.Date, x.Message);
  }

这是处理用户查看所有日志的请求的控制器:

[DependencyPropertyLolJk]
protected ILogProvider MyLogProvider {get;set;} // set by DI

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Logs()
{
    return View("Logs", LogEvent.GetAllLogs(MyLogProvider).OrderByDescending(x => x.Date));
}

以下是视图以及它如何与模型绑定:

<!-- header left out for brevity -->
<table>
    <thead>
        <tr>
            <th>
                Date
            </th>
            <th>
                Title
            </th>
            <th>
                Message
            </th>
        </tr>
    </thead>
    <% foreach(var log in ViewData.Model) %>
    <tr>
<td><%= log.Date %></td>
<td><%= log.Title %></td>
<td><%= log.Message %></td>
    </tr>
    <% }; %>
</table>

<!-- ... -->

所以你看,你必须使用内联代码编写你的html。这适用于简单的用户界面,但对于更复杂的事情,例如寻呼机和网格视图,这可能很复杂,也很麻烦。

当您的UI变得复杂时,最简单的方法是创建HtmlHelper类的扩展。以下两个示例展示了如何降低UI的复杂性:HtmlHelper GridViewPager控件。我已经创建了类似的帮助方法,并且你可以在lambdas中混合使用html和内联代码。现在,如果设计师只能正确地格式化这种混合代码/标记......