下面我们一步一步完成“MVC公告发布系统”的公告发布功能,等做完这个功能,上面的问题就明了了。
先修改一个错误...
      这里,首先要像大家道歉,因为在第一篇里,我犯了一个错误。就是在公告的实体类AnnounceInfo中少了一个属性。现在,我们在AnnounceInfo中添加一个叫Cateogry的属性,类型为int,它用来指明这个公告属于哪个分类。
      对于这个错误,我十分抱歉。
建立输入信息页面
      下面,正式开始我们的工作。首先,我要建立一个页面,用来让用户输入公告信息。而我们知道,在ASP.NET MVC中不能直接请求aspx文件,任何请求都要通过Controller,所以,我们首先在Controllers目录下建立一个新的Controller类,名叫AnnounceController。删除其中自动生成的Index方法,新建一个名叫Release的Action方法,具体代码如下。
AnnounceController.cs:
 using System;
using System; using System.Collections.Generic;
using System.Collections.Generic; using System.Linq;
using System.Linq; using System.Web;
using System.Web; using System.Web.Mvc;
using System.Web.Mvc; using System.Web.Mvc.Ajax;
using System.Web.Mvc.Ajax; using MVCDemo.Models;
using MVCDemo.Models; using MVCDemo.Models.Interfaces;
using MVCDemo.Models.Interfaces; using MVCDemo.Models.Entities;
using MVCDemo.Models.Entities;
 namespace MVCDemo.Controllers
namespace MVCDemo.Controllers {
{ public class AnnounceController : Controller
    public class AnnounceController : Controller {
    { public ActionResult Release()
        public ActionResult Release() {
        { ICategoryService cServ = ServiceBuilder.BuildCategoryService();
            ICategoryService cServ = ServiceBuilder.BuildCategoryService(); List<CategoryInfo> categories = cServ.GetAll();
            List<CategoryInfo> categories = cServ.GetAll(); ViewData["Categories"] = new SelectList(categories, "ID", "Name");
            ViewData["Categories"] = new SelectList(categories, "ID", "Name"); return View("Release");
            return View("Release"); }
        } }
    } }
}
      这个就是要呈现表单页的Action方法,看看它做了什么:它首先取出所有的分类,然后将它们转成SelectList类型存入ViewData,最后呈现Release视图。
      为什么要取出所有分类呢?因为我们在发布公告时希望有个下拉列表框列出所有公告名称,让用户可以选择要发布的公告属于哪个分类。而SelectList是ASP.NET MVC中用于绑定到下拉列表的类型。它有很多重载的构造方法,其中我使用的是三个参数的,它们分别表示:生成数据的枚举,绑定到value的字段名,绑定到列表名称的字段名。这里,将把所有分类实体集合绑定到下拉列表,而ID属性作为值,Name属性作为显示在列表框中的名字。
      如果我们不需要下拉列表框来显示所有分类,那么Release方法只需一行return View("Release");就可以了。
      Action方法做完了,我们还需要视图。在Views目录下建立Announce目录,再在这个Announce目录下建立Release.aspx视图。代码如下。
Release.aspx:
 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Release.aspx.cs" Inherits="MVCDemo.Views.Announce.Release" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Release.aspx.cs" Inherits="MVCDemo.Views.Announce.Release" %> <%@ Import Namespace="MVCDemo.Models.Entities" %>
<%@ Import Namespace="MVCDemo.Models.Entities" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" >
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">
<head runat="server"> <title></title>
    <title></title> </head>
</head> <body>
<body> <% SelectList categories = ViewData["Categories"] as SelectList; %>
    <% SelectList categories = ViewData["Categories"] as SelectList; %> <div>
    <div> <h1>MVC公告发布系统——发布公告</h1>
        <h1>MVC公告发布系统——发布公告</h1> <% Html.BeginForm("DoRelease","Announce",FormMethod.Post); %>
        <% Html.BeginForm("DoRelease","Announce",FormMethod.Post); %> <dl>
        <dl> <dt>标题:</dt>
            <dt>标题:</dt> <dd><%= Html.TextBox("Title") %></dd>
            <dd><%= Html.TextBox("Title") %></dd> <dt>分类:</dt>
            <dt>分类:</dt> <dd><%= Html.DropDownList("Category",categories) %></dd>
            <dd><%= Html.DropDownList("Category",categories) %></dd> <dt>内容:</dt>
            <dt>内容:</dt> <dd><%= Html.TextArea("Content") %></dd>
            <dd><%= Html.TextArea("Content") %></dd> </dl>
        </dl> <input type="submit" value="发布" />
        <input type="submit" value="发布" /> <% Html.EndForm(); %>
        <% Html.EndForm(); %> </div>
    </div> </body>
</body> </html>
</html>
      代码不复杂,但是要注意几个地方。categories不多说了,这是刚才我们传递过来的所有分类组成的列表项。我觉得大家迷惑的可能是那些Html.***的东西,其实,Html是ViewPage的中的一个对象(ViewPage是所有视图的基类),它主要的左右就是产生各种表单项(先这么认为吧,其实它还有其他功能),例如Html.BeginForm就是说这里开始一个form标签,而Html.EndForm当然是form标签结束。其他几个,看名字相信大家也猜出来了。
      至于为什么这么做,也不直接使用原始的HTML标签,我先不多说,以后大家做多了自然就理解了,目前大家只要知道,这样做可以避免一个url问题以及让url更灵活就行了。^_^
      回到这个页面,BeginForm有三个参数,分别是提交请求的Action名,提交请求的Controller名和请求方式。所以,这个页面的意思就是使用post方法请求http://localhost/Announce/DoRelease这个Action来处理我们的请求。
      页面中有三个输入表单和一个提交按钮。三个输入表单分别是:名叫Title的文本框,名叫Content的文本域和名叫Category的下拉列表框。注意下拉列表是怎么绑定的,只要将含有数据的SelectList作为第二个参数就行了。完成后,页面是这样子的:
 处理请求
 
 
处理请求 using System;
using System; using System.Collections.Generic;
using System.Collections.Generic; using System.Linq;
using System.Linq; using System.Web;
using System.Web; using System.Web.Mvc;
using System.Web.Mvc; using System.Web.Mvc.Ajax;
using System.Web.Mvc.Ajax; using MVCDemo.Models;
using MVCDemo.Models; using MVCDemo.Models.Interfaces;
using MVCDemo.Models.Interfaces; using MVCDemo.Models.Entities;
using MVCDemo.Models.Entities;
 namespace MVCDemo.Controllers
namespace MVCDemo.Controllers {
{ public class AnnounceController : Controller
    public class AnnounceController : Controller {
    { public ActionResult Release()
        public ActionResult Release() {
        { ICategoryService cServ = ServiceBuilder.BuildCategoryService();
            ICategoryService cServ = ServiceBuilder.BuildCategoryService(); List<CategoryInfo> categories = cServ.GetAll();
            List<CategoryInfo> categories = cServ.GetAll(); ViewData["Categories"] = new SelectList(categories, "ID", "Name");
            ViewData["Categories"] = new SelectList(categories, "ID", "Name"); return View("Release");
            return View("Release"); }
        }
 public ActionResult DoRelease()
        public ActionResult DoRelease() {
        { AnnounceInfo announce = new AnnounceInfo()
            AnnounceInfo announce = new AnnounceInfo() {
            { ID = 1,
                ID = 1, Title = Request.Form["Title"],
                Title = Request.Form["Title"], Category = Int32.Parse(Request.Form["Category"]),
                Category = Int32.Parse(Request.Form["Category"]), Content = Request.Form["Content"],
                Content = Request.Form["Content"], };
            };
 IAnnounceService aServ = ServiceBuilder.BuildAnnounceService();
            IAnnounceService aServ = ServiceBuilder.BuildAnnounceService(); aServ.Release(announce);
            aServ.Release(announce);
 ViewData["Announce"] = announce;
            ViewData["Announce"] = announce; return View("ReleaseSucceed");
            return View("ReleaseSucceed"); }
        } }
    } }
}
 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ReleaseSucceed.aspx.cs" Inherits="MVCDemo.Views.Announce.ReleaseSucceed" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ReleaseSucceed.aspx.cs" Inherits="MVCDemo.Views.Announce.ReleaseSucceed" %> <%@ Import Namespace="MVCDemo.Models.Entities" %>
<%@ Import Namespace="MVCDemo.Models.Entities" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" >
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">
<head runat="server"> <title></title>
    <title></title> </head>
</head> <body>
<body> <% AnnounceInfo announce = ViewData["Announce"] as AnnounceInfo; %>
    <% AnnounceInfo announce = ViewData["Announce"] as AnnounceInfo; %> <div>
    <div> <h1>MVC公告发布系统——发布公告成功</h1>
        <h1>MVC公告发布系统——发布公告成功</h1> <dl>
        <dl> <dt>ID:</dt>
            <dt>ID:</dt> <dd><%= announce.ID %></dd>
            <dd><%= announce.ID %></dd> <dt>标题:</dt>
            <dt>标题:</dt> <dd><%= announce.Title %></dd>
            <dd><%= announce.Title %></dd> <dt>类别ID:</dt>
            <dt>类别ID:</dt> <dd><%= announce.Category %></dd>
            <dd><%= announce.Category %></dd> <dt>内容:</dt>
            <dt>内容:</dt> <dd><%= announce.Content %></dd>
            <dd><%= announce.Content %></dd> </dl>
        </dl> </div>
    </div> </body>
</body> </html>
</html>
 看到没有,我没有骗你们,表单数据真的传过来了!^_^|||
 
      看到没有,我没有骗你们,表单数据真的传过来了!^_^|||