`
ljl_xyf
  • 浏览: 618639 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第四篇:传递表单数据( MVC案例教程(基于ASP.NET MVC beta))

阅读更多

摘要
      本文将完成我们“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
分享到:
评论

相关推荐

    基于ASP.NET Ajax框架实现表单验证编程原理

    基于ASP.NET Ajax框架实现表单验证编程原理

    ASP.NET MVC 4高级编程 第4版PDF.rar

    《ASP.NET MVC 4高级编程(第4版)》主要有以下核心内容: 解释ASP.NET MVC框架与“文件页”Web框架的不同之处; 介绍控制器、视图、模型、表单、HTML辅助方法、数据注解、验证、成员资格、授权、安全和路由; ...

    【免费】ASP.NET MVC5 高级编程[附源码].rar

    本书的作者加洛韦不是Microsoft的ASP.NET MVC专家,就是ASP.NET MVC领域的智者,所以作为一本实用的教程,不但强化开发人员对概念的认识,也帮助开发人员创建自己的应用程序。 主要内容 解释了ASP.NET MVC框架与...

    ASPnet MVC教程 19.表单验证

    Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解 03:53 Aspnet Mvc教程 7.ViewData 04:51 Aspnet Mvc教程 8.TempData 02:50 Aspnet Mvc教程 9....

    asp.net mvc demo

    asp.net mvc demo 展示了asp.net mvc强大的表单验证功能 也很好避免asp.net mvc模式的缺点

    asp.net夜话

    四、 ASP.NET 夜话之 4 : Visual Studio 2005 中容易被忽略的技巧 五、 ASP.NET 夜话之 5 : Page 类和回调技术 六、 ASP.NET 夜话之 6 : ASP.NET 基本控件 七、 ASP.NET 夜话之 7 : ADO.NET 介绍 八、 ASP.NET ...

    ASP.NET MVC 4高级编程(包含源码)

    由Microsoft专家和极受敬重的软件开发社区负责人撰写的《ASP.NET MVC 4高级编程(第4版)》将带您学习最前沿的Web框架:ASP.NET MVC 4。本书开篇简要介绍ASP.NET MVC框架,然后直奔主题,讨论使用ASP.NET和最新...

    asp.net教程 ASP.NET 参考手册

    本章介绍如何创建您的第一个简单的 ASP.NET 页面。 ASP.NET 服务器控件 本章介绍 ASP.NET 服务器控件。 ASP.NET 事件 本章介绍一些 ASP.NET 事件句柄。 ASP.NET Forms ASP.NET WEB 表单 本章介绍 ASP.NET 的 ...

    基于ASP.net MVC、AJAX智能表单的通用业务流程管理系统

    创建ASP.NET MVC工程、创建数据库、ViewData的使用方法和ViewModel类的构造 、Master.Page和Partials构建UI 、高效率的换页(Paging)构造方法 、应用程序的漏洞防御 、使用AJAX动态更新方法

    asp.net mvc3 表单提交和异步提交

    asp.net mvc3 表单提交和异步提交;asp.net mvc3 表单提交和异步提交

    ASP.NET MVC 4高级编程(第4版)中文版 超清晰PDF

    MVC专家“梦之队”对ASP.NET MVC 4的全新诠释 由Microsoft专家和极受敬重的软件开发社区负责人撰写的《ASP.NET MVC 4高级编程(第4版)》将带您学习最前沿的Web框架:ASP.NET MVC 4。本书开篇简要介绍ASP.NET MVC框架...

    ASP.NET MVC 5高级编程 第5版(中文版)

    本书的作者加洛韦不是Microsoft的ASP.NET MVC专家,就是ASP.NET MVC领域的智者,所以作为一本实用的教程,不但强化开发人员对概念的认识,也帮助开发人员创建自己的应用程序。 主要内容 解释了ASP.NET MVC框架与...

    ASP.NET MVC+EF6+Bootstrap开发C#源代码

    核心框架:ASP.NET MVC5、WEB API 持久层框架:EntityFramework 定时计划任务:Quartz.Net组件 安全支持:过滤器、Sql注入、请求伪造 服务端验证:实体模型验证、自己封装Validator 缓存框架:微软自带Cache、...

    Aspnet Mvc教程 16.表单生成及Post传值

    Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解 03:53 Aspnet Mvc教程 7.ViewData 04:51 Aspnet Mvc教程 8.TempData 02:50 Aspnet Mvc教程 9....

    Aspnet Mvc教程 17.UpdateModel

    Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解 03:53 Aspnet Mvc教程 7.ViewData 04:51 Aspnet Mvc教程 8.TempData 02:50 Aspnet Mvc教程 9....

    《[精通ASP.NET.MVC.5框架》高清带书签

    1.5.1 第1部分:ASP.NET MVC 5导论 8 1.5.2 第2部分:ASP.NET MVC细节 8 1.6 本版的新特点 9 1.7 获取示例代码 9 1.8 本书所需的软件 10 1.9 诚信 10 1.10 小结 10 第2章 第一个MVC应用程序 11 2.1 准备Visual ...

    ASP.NET MVC 3高级编程

    《asp.net mvc 3高级编程》 第1章 入门 1 1.1 asp.net mvc简介 1 1.1.1 asp.net mvc如何适应asp.net 1 1.1.2 mvc模式简介 2 1.1.3 mvc在web框架中的应用 2 1.1.4 asp.net mvc 3的发展历程 3 1.1.5 razor视图...

    ASP.NET MVC 4高级编程(第4版)中文版 超清晰PDF及配套源码Part1

    本书简明易懂,用趣味的引导方式带您学习最前沿的Web框架:ASP.NET MVC 4。开篇简要介绍ASP.NET MVC框架,然后直奔主题,讨论使用ASP.NET和最新MicrosoftMVC来构建数据驱动的动态网站需要了解的所有重要知识点。书中...

    asp.net工作流管理系统源码MVC工作流源码

    用asp.net MVC5开发的工作流引擎,本源码包含可视化流程设计器,表单设计器。适合对象:需要从事OA办公系统、CRM客户关系系统、HR人事管理系统的你参考学习之用,同时你还可以学习现在流行的MVC。

    快速开发框架C#源码完全开源版 基于ASP.NET MVC+EF6+Bootstrap框架等

    1、一套基于ASP.NET MVC+EF6+Bootstrap开发出来的框架,源代码完全开源,可以帮助你解决C#以及.NET项目68%的重复工作,让开发人员远离加班。 2、使用ApacheLicense2.0协议,采用主流框架,容易上手,简单易学,学习...

Global site tag (gtag.js) - Google Analytics