摘要
本文将完成我们“MVC公告发布系统”的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据。
前言
通过前几篇文章,我们已经能比较自如的使用ASP.NET
MVC来呈现页面和数据了。但是,有一个大问题没有解决:如何处理表单数据。例如,我们将要实现的公告发布功能,用户肯定是在某个表单页面输入标题、正文
等内容,而后提交,然后表单数据要被传递到相应的地方交由业务逻辑组件处理。
在传统的ASP.NET下,使用的是Model1模式,每个aspx页面有一个同名的aspx.cs文件,当提交表单时,默认数据被提交到这个同名
aspx.cs文件中某个方法下处理。但是,在ASP.NET
MVC中,这种方法不能用了,因为我们换用了Model2模式,不能再用同名代码文件来处理aspx的提交请求(但是这不表明同名代码文件就没有用了,实
际上,它依然会被执行,但是我们不提倡在里面处理任何逻辑,但是,有时会利用它进行一些初始化操作。),那么应该怎么做呢?不多讲,我们以例子说明问题。
下面我们一步一步完成“MVC公告发布系统”的公告发布功能,等做完这个功能,上面的问题就明了了。
先修改一个错误...
这里,首先要像大家道歉,因为在第一篇里,我犯了一个错误。就是在公告的实体类AnnounceInfo中少了一个属性。现在,我们在AnnounceInfo中添加一个叫Cateogry的属性,类型为int,它用来指明这个公告属于哪个分类。
对于这个错误,我十分抱歉。
建立输入信息页面
下面,正式开始我们的工作。首先,我要建立一个页面,用来让用户输入公告信息。而我们知道,在ASP.NET
MVC中不能直接请求aspx文件,任何请求都要通过Controller,所以,我们首先在Controllers目录下建立一个新的
Controller类,名叫AnnounceController。删除其中自动生成的Index方法,新建一个名叫Release的Action方
法,具体代码如下。
AnnounceController.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using MVCDemo.Models;
using MVCDemo.Models.Interfaces;
using MVCDemo.Models.Entities;
namespace MVCDemo.Controllers
{
public class AnnounceController : Controller
{
public ActionResult Release()
{
ICategoryService cServ = ServiceBuilder.BuildCategoryService();
List<CategoryInfo> categories = cServ.GetAll();
ViewData["Categories"] = new SelectList(categories, "ID", "Name");
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" %>
<%@ 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">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<% SelectList categories = ViewData["Categories"] as SelectList; %>
<div>
<h1>MVC公告发布系统——发布公告</h1>
<% Html.BeginForm("DoRelease","Announce",FormMethod.Post); %>
<dl>
<dt>标题:</dt>
<dd><%= Html.TextBox("Title") %></dd>
<dt>分类:</dt>
<dd><%= Html.DropDownList("Category",categories) %></dd>
<dt>内容:</dt>
<dd><%= Html.TextArea("Content") %></dd>
</dl>
<input type="submit" value="发布" />
<% Html.EndForm(); %>
</div>
</body>
</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作为第二个参数就行了。完成后,页面是这样子的:
处理请求
现在我们可以输入信息了,但是如果你输入后点提交,你会发现产生了经典的404错误。刚才我们说了,表单提交到的Action是Announce下的DoRelease,但是现在没有这个Action,当然会404了。下面,我们来建立这个处理程序。
回到AnnounceController,新建Action方法DoRelease,具体代码如下。
AnnounceController.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using MVCDemo.Models;
using MVCDemo.Models.Interfaces;
using MVCDemo.Models.Entities;
namespace MVCDemo.Controllers
{
public class AnnounceController : Controller
{
public ActionResult Release()
{
ICategoryService cServ = ServiceBuilder.BuildCategoryService();
List<CategoryInfo> categories = cServ.GetAll();
ViewData["Categories"] = new SelectList(categories, "ID", "Name");
return View("Release");
}
// http://www.my400800.cn
public ActionResult DoRelease()
{
AnnounceInfo announce = new AnnounceInfo()
{
ID = 1,
Title = Request.Form["Title"],
Category = Int32.Parse(Request.Form["Category"]),
Content = Request.Form["Content"],
};
IAnnounceService aServ = ServiceBuilder.BuildAnnounceService();
aServ.Release(announce);
ViewData["Announce"] = announce;
return View("ReleaseSucceed");
}
}
}
我们看,它首先新建一个AnnounceInfo类型的实体类,用来存贮这个新的公告的信息。注意它是怎么得到表单信息的,对了,用了
Request.Form["表单名"],这就是获得表单信息的一种方法,当然还有其他方法,但是我推荐这一种。注意,这里的表单名就是我们使用
Html.***方法生成表单时的名字。
OK,下面就是调用业务逻辑组件,完成
400电话
发布公告功能。
但是这里有个问题,我们的业务逻辑组件是Mock的,也就是说其实什么都没做啊。如果是真的业务逻辑组件,我们可以去数据库看看有没有添加公告信息成功,
可是这里没有,我们要怎么证明表单数据传递过来了呢?于是我想了一个办法,有新加了一个ReleaseSucceed视图,用来显示新发布公告的信息,以
此证明我们确实把表单信息传过来了。ReleaseSucceed视图如下:
ReleaseSucceed.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ReleaseSucceed.aspx.cs" Inherits="MVCDemo.Views.Announce.ReleaseSucceed" %>
<%@ 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">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<% AnnounceInfo announce = ViewData["Announce"] as AnnounceInfo; %>
<div>
<h1>MVC公告发布系统——发布公告成功</h1>
<dl>
<dt>ID:</dt>
<dd><%= announce.ID %></dd>
<dt>标题:</dt>
<dd><%= announce.Title %></dd>
<dt>类别ID:</dt>
<dd><%= announce.Category %></dd>
<dt>内容:</dt>
<dd><%= announce.Content %></dd>
</dl>
</div>
</body>
</html>
这些代码就不用我过多解释了。下面,我们输入一些信息,提交看看:
看到没有,我没有骗你们,表单数据真的传过来了!^_^|||
小结
通过这四篇文章,我们已经了解了ASP.NET
MVC的基本原理,并且已经会呈现数据页面及传递表单数据处理了。会了这些,其实已经可以应付绝大多数主要开发了。从下篇开始,我们接触一些高级点的内
容。下篇将说一下ASP.NET MVC如何与ASP.NET
AJAX及JQuery结合,再后面,会讲到拦截器及与Silverlight结合的内容。
- 大小: 16 KB
- 大小: 16.5 KB
分享到:
相关推荐
尽管项目可能主要基于MVC,但ASP.NET Web Forms也可能在某些地方被用来构建表单或交互式页面。Web Forms提供了一种事件驱动的编程模型,适合那些习惯于WinForms开发的开发者。 6. **AJAX技术**: 为了实现页面的...
在"ASP.NET源码——[CMS程序]峰弛cms beta.zip"中,我们可以看到一个基于ASP.NET开发的网站内容管理系统(CMS)。CMS系统通常用于管理网站的内容,如文章发布、页面构建、用户管理等,而峰弛cms beta则是这个特定CMS...
4. **数据存储与安全**:利用ASP.NET的数据访问层,EESv3.0可能有良好的数据库集成,确保数据的安全性和一致性。 5. **响应式设计**:考虑到跨平台访问的需求,EESv3.0可能采用了响应式设计,确保在不同设备上都能...
在ASP.NET中,实现这个功能通常需要创建一个数据表来存储留言内容,包括用户名、留言时间、内容等字段,并通过ASP.NET Web Forms或MVC模式设计前端界面,用户可以通过表单提交留言,后台则处理这些提交并将其保存到...
2. **MVC(Model-View-Controller)**:ASP.NET MVC 模式允许开发者分离业务逻辑、数据模型和用户界面,增强了代码的可测试性和可维护性,适用于构建复杂的应用程序,如电子商务平台。 3. **Entity Framework**:这...
综上所述,Bincess论坛Beta2是一个基于ASP.NET技术构建的论坛平台,它利用了ASP.NET的控件、页面生命周期管理、数据访问、MVC架构、状态管理、安全性和部署配置等特性,为用户提供了一个互动性强、功能完善的社区...
【ASP.NET源码——恒浪网站整合管理系统HoWave IMS Beta 2(SQL版).zip】是一个包含ASP.NET技术实现的网站管理系统的源代码包。这个系统主要用于整合和管理网站的各项功能,适应于企业和组织进行高效的内容管理和信息...
【CMS程序】Shangdu .NET 后台管理系统 V1.0 Beta2 是一款基于 ASP.NET 技术开发的内容管理系统,适用于构建企业网站、新闻门户、电子商务等多种类型的在线平台。这款系统提供了强大的管理功能,包括文章发布、用户...
1. **MVC(Model-View-Controller)架构**:ASP.NET MVC 是一种设计模式,用于将业务逻辑、数据模型和用户界面分离,使得代码更易于维护和扩展。 2. **ADO.NET**:用于数据库交互,如SQL Server或其他支持.NET的...
【电子商务】友思B2B拍宝网(.Net开源版) v0.4 Beta_b2bsite(ASP.NET源码)是一款基于.NET框架的电子商务平台源代码,专为B2B(Business to Business)业务设计。这个开源项目为开发者提供了一个深入了解ASP.NET技术...
在ASP.NET中,这涉及对ASP.NET MVC框架的运用,以及与第三方支付平台(如支付宝或微信支付)的API接口集成。通过这个项目,你可以学习到如何实现安全的在线交易流程。 5. Fireworks8.zip 这个文件看起来不是ASP.NET...
【ASP.NET源码——[博客空间]CNBlogs DotText v1.0 Beta2offbye美化版.zip】这个压缩包包含的是一个基于ASP.NET技术构建的个人博客系统——DotText的美化版本。DotText是一款开源的博客引擎,最初由Scott ...
本示例是针对ASP.NET 5 DNX Beta 4版本的集成测试实践。 在ASP.NET 5中,引入了DNX(.NET Execution Environment)作为跨平台的运行时环境。DNX允许开发者在不同的操作系统上构建、管理和运行.NET应用。对于集成...
ASP.NET留言本是一款基于微软的ASP.NET技术开发的在线交互应用,主要功能是提供一个平台让用户可以在网站上留下他们的信息、建议或者问题。这个程序的源代码被封装在"aspnetbook.rar"的压缩包中,包含的子文件可能是...
QQ头像网 beta2-ASP源码.zip是一个包含ASP源代码的压缩文件,主要用于搭建一个类似于QQ头像网站的平台。ASP(Active Server Pages)是微软开发的一种服务器端脚本环境,用于创建动态交互式网页。这个源码可能是由...
Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、...