这里说的ASP.NET MVC 指的是ASP.NET MVC 1.0版。入门教程推荐:“从零开始学习ASP.NET MVC 1.0 ” 。以下是项目实践中的一点总结:
1、 动态绑定Html.DropDownList
方法:
public SelectList BindUserArea() { IQueryable<Area> areaList = areaRepository.GetAll(); List<SelectListItem> selectListAreas = new List<SelectListItem>(); foreach (Area item in areaList) { selectListAreas.Add(new SelectListItem { Text = item.name, Value = item.areaid.ToString() }); } return new SelectList(selectListAreas, "Value", "Text"); }
这里的areaRepository.GetAll()是抽象和封装了LINQ TO SQL查询的方法,这里只贴出一篇相关文章的链接:参考>>(Repository类)。建议感兴趣的朋友研究一下ASP.NET MVC开源项目"Suteki.Shop",里面的代码很经典。这一个Repository类综合运用了泛型、约束、LINQ,Lambda表达式等。项目下载地址:sutekishop
在该页面的Action中这样使用上面的方法:
ViewData["areaSelectList"] = serviceObj.BindUserArea();
将得到的结果赋值给一个ViewData对象以便在页面中使用。
在页面中这样使用这个ViewData对象:
<%=Html.DropDownList("area", ViewData["areaSelectList"] as SelectList)%>
以上是ASP.NET MVC中的动态绑定Html.DropDownList的方法。因为这里的area信息并不是固定不变的。
其实Html.DropDownList最后得到的就是HTML中的select标签及其option标签,因此也可以使用AJAX请求该页面的方法,在该方法中生成对应的HTML,返回给页面,再追加到页面中指定的位置(比如某个DIV中)来实现。这种方法这里不做介绍。
2、 ASP.NET MVC表单提交
比如我要做一个用户查询页面,其中一个条件是用户名,在ASP.NET MVC中我怎么才能将该条件传给该页面对应的Action,并将结果在页面中显示?见如下代码:
ListUser页面代码:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/DefaultSite.Master" Inherits="System.Web.Mvc.ViewPage<IPagedList<User>>" %> <%@ Import Namespace="MyProject.Models" %> <%@ Import Namespace="MvcPaging" %> <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> ListUser </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <div class="formDiv"> <%using (Html.BeginForm("ListUser", "Admin", FormMethod.Post))%> <%{%> <div style="height: 45; margin-bottom: 5px;"> <div style="float: left; padding-top: 5px; padding-left: 40px; color: #D1D1D1; width: 300px;"> 姓名:<%=Html.TextBox("username", ViewData["username"])%> </div> <div style="float: left; padding-left: 40px;" mce_style="float: left; padding-left: 40px;"> <%=Html.TextBox("submitBtn","", new { type = "image", src = "../../Content/Image/search.jpg" })%> </div> </div> <%}%> <div style="padding-left: 40px;" mce_style="padding-left: 40px;"> <table class="isTable" style="width: 900px; padding-left: 0px;"> <tr> <th> 编号 </th> <th> 用户名 </th> <th> 邮箱 </th> <th> 地区 </th> </tr> <%foreach (var item in Model) {%> <tr> <td> <%=Html.Encode(item.userid)%> </td> <td> <%=Html.Encode(item.username)%> </td> <td> <%=Html.Encode(item.email)%> </td> <td> <%=Html.Encode(item.area)%> </td> </tr> <%}%> </table> <div class="pager"> <%=Html.Pager(ViewData.Model.PageSize, ViewData.Model.PageNumber, ViewData.Model.TotalItemCount, new{ username = ViewData["username"]})%> </div> </div> </div> </asp:Content>
Html.BeginForm("ListUser", "admin",FormMethod.Post)最终对应的HTML是<form action="/admin/ListUser" method="post">,这个和Html.DropDownList方法一样,是ASP.NET MVC中特有的方法,其实这里我们完全可以使用对应的HTML标签。
ListUser页面的Action:
public ActionResult ListUser (int? page, FormCollection form) { int pageValue = page.HasValue ? page.Value : 1; string username = form["username"]; ViewData["username"]= username; IQueryable<User> users = serviceObj.SelectUser(username); ViewData.Model = users.ToPagedList(pageValue,10); //数据传给页面 return View("ListUserTest"); }
这里除了定义一个FormCollection对象作为参数,还可以直接定义对应的string参数。比如,这里就可以直接定义参数username,那么在submit之后,username的值就是在页面输入的查询关键字。
SelectUser方法如下:
public IQueryable<User> SelectUser(string username) { username = username ?? ""; IQueryable<User> users = userRepository.GetAll().Where(u => u.username.Contains(username)); //LINQ模糊查询 return users; }
页面顶部代码中Inherits属性指定的是页面接收的数据类型,IpagedList是MvcPaging中的方法,这里不作介绍,给个相关文章的链接:参考>>(ASP.NET MVC分页)。更多总结会陆续更新上来。