ASP.NET MVC 重点教程一周年版 第三回 Controller与View

这节我们让ASP.NET MVC真正的跑起来

一、新建Controller

首先我们自己新建一个新的Controller在Controllers上点右键,添加,Controller选项

image 
之后出现一个对话框:

image 
这里我们将之起名为EiceController
附注一下,这里是个纯广告,无兴趣可略过此行:www.eice.com.cn为您建立Web2.0社交网站
默认生成的代码如下:

    //记不记得前面讲过的,所有Controller都要继承于Controller类
    public class EiceController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }

二、新建View文件

当然,除了Controller我们还要建个View,先在Views中建个Eice文件夹,然后我们要在其中建个Index.aspx。

不过除此之外ASP.NET MVC还为我们提供了一种新建View的快捷方式。

在对应的Controller的Action中点右键,选择Add View。

image 

之后弹出窗口

image

确定好View文件名字及母版文件后点Add就建好了一个View文件。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
	Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Index</h2>
</asp:Content>

 

 

如果要建无母版页面勾去select master page即可。

三、编辑Controller、View完成一个简单的页面传值

我们将EiceController的Index改写为

    public class EiceController : Controller
    {
        public ActionResult Index(string id)
        {
            ViewData["chsword"] = id;
            return View();
        }
    }

在View文件即/Views/Eice/Index.aspx中改写

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
	Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<%=ViewData["chsword"] %>
</asp:Content>

下面我们来访问/Eice/Index/HellowEice,可以看到:

image

这样我们就将一个值从Url传到Controller,又从Controller传到View显示出来。

由上面程序段可以看出Action的参数string id用于接收{Controller}/{Action}/{id}的ID部分

ViewData是一个页面间的IDictionary用于Controller向View传递数据
这样View与Controller就可以协作完成显示页面与逻辑处理的工作了

 

那除了ViewData之外我们还有什么方法由Controller向View文件传值?我们除了能显示aspx文件外还能显示其它的文件么?

 

参考资料:pv版本Asp.net Mvc Framework 三 (Controller与View)

posted @ 2009-03-11 23:52 重典 阅读(11291) 评论(21) 编辑 收藏

 回复 引用   
#1楼2009-03-12 18:05 | YYYYYY[未注册用户]
哪里有定义QueryString?感觉文章不完整
 回复 引用 查看   
#2楼[楼主]2009-03-12 20:03 | 重典      
@YYYYYY
那里的确写的有些不清楚,已经改正了

 回复 引用   
#3楼2009-03-12 22:31 | YYYYYY[未注册用户]
大哥,你这个上面好像没有定义"HelloEice"的句子啊,
怎么显示出来的?

 回复 引用 查看   
#4楼[楼主]2009-03-12 22:48 | 重典      
@YYYYYY

1.访问/Eice/Index/HellowEice
2.使用UrlRouting规则{Controller}/{Action}/{id}
3.将id与HellowEice对应
4.执行index(string id)

 回复 引用   
#5楼2009-03-13 00:00 | YYYYYY[未注册用户]
ViewData["chsword"] = id;
是不是这里的id的值就等于"HelloEice"呀?所以在view中就显示的是=ViewData["chsword"]也就是id的值,这里的chsword是不是可以顺便取名的?

另外我想在Index3.aspx中显示name和sex为中文,但是直接把该文件里改成中文,编译就通不过,是什么原因啊?怎么解决呢?

 回复 引用 查看   
#6楼[楼主]2009-03-13 09:05 | 重典      
--引用--------------------------------------------------
YYYYYY: ViewData[&quot;chsword&quot;] = id;
是不是这里的id的值就等于&quot;HelloEice&quot;呀?所以在view中就显示的是=ViewData[&quot;chsword&quot;]也就是id的值,这里的chsword是不是可以顺便取名的?

另外我想在Index3.aspx中显示name和sex为中文,但是直接把该文件里改成中文,编译就通不过,是什么原因啊?怎么解决呢?
--------------------------------------------------------
1.你理解的对,那个的确是可以随意取名的
2.编码问题,将文件存为UTF8之后Meta编码也也 为utf8即可(master)
即 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
改为
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

 回复 引用   
#7楼2009-03-13 10:47 | YYYYYY[未注册用户]
非常感谢!
我是没有找到id=HelloEric的句子,所以不太理解id的值为什么是HelloEric?
还有我的MVC解决方案管理器里面的.aspx文件怎么找不到对应的.aspx.cs文件?有关代码又该写到哪里呢?


 回复 引用 查看   
#8楼[楼主]2009-03-13 11:05 | 重典      
@YYYYYY
1.为什么是HellowEice
因为URL是 /Eice/Index/HellowEice 而且有UrlRouting规则{Controller}/{Action}/{id}
可以看作这个规则将
Controller/Action?id=xxx映射成了 Controller /Action/xxx
所以执行index(string id)时id为HellowEice

2.没有.cs文件,逻辑是Controller完成,操作数据可以由ModelManager(或其它模式)来操作Model

您也可以看一下我的这篇文章:http://www.cnblogs.com/chsword/archive/2008/09/29/aspnetmvc_video.html

其中前几个视频也许可以解决您的疑问

 回复 引用   
#9楼2009-03-13 11:32 | YYYYYY[未注册用户]
谢谢解答~~
 回复 引用 查看   
#10楼[楼主]2009-03-13 11:35 | 重典      
@YYYYYY
^^不客气

 回复 引用   
#11楼2009-04-09 09:47 | 随风飘叶
重典:这的视频教程我已经全部看过啦,虽然和mvc正式版有点出处,但基本也都运行出来啦,我是希望能不能在提供一点。mvc和数据库交换的视频教程与sql和access的数据库交互的几个小例子。这样看起来更有实用性。
 回复 引用 查看   
#12楼[楼主]2009-04-10 16:40 | 重典      
@随风飘叶
操作数据库的部分因为与WebForm 甚至与WinForm都是一样的,所以就没有写。

 回复 引用 查看   
#13楼2009-04-16 09:21 | 风疑      
正在学习中,受教了,果然还是重典讲的透彻
 回复 引用   
#14楼2009-04-18 16:30 | 随风飘叶
这个好像有错哦,
public ActionResult Index()
{
ViewData["name"] = "随风";
return View();
}
<%=ViewData["name"] %>
这样就能运行出来啦。
我还是希望能不能提供一个小的例子给我。我一般是做小型网站开发,用的是aeecss数据库,有个例子学感觉学的更快一点。
我的msn:sd533@msn.com,希望你能提供一个小的程序学习一下。

 回复 引用 查看   
#15楼2009-04-25 00:04 | 肖敏      
ViewData是如何从Controller传递到View的,是放在缓存中?
 回复 引用 查看   
#16楼[楼主]2009-04-25 10:13 | 重典      
@肖敏
是Controller调用的View,
首先是Controller的View()方法
然后调用了Execute()方法

 回复 引用 查看   
#17楼2010-01-12 11:03 | csdn_li      
不错,不错!支持支持!
 回复 引用 查看   
#18楼2010-03-25 15:30 | 火云女神      
public class EiceController : Controller
{
public ActionResult Index(string id)
{
ViewData["chsword"] = id;
return View();
}
}
为什么我把这里面的参数名ID 换成其他的参数名参数就无法显示
<%=ViewData["chsword"] %>
这里还是空,只有当参数名是ID才会显示出来,这是为什么呢?谢谢!

 回复 引用 查看   
#19楼[楼主]2010-03-26 10:48 | 重典      
@火云女神
上下要统一,也要确保Url是否有传参
如果是这样的
public class EiceController : Controller
{
public ActionResult Index(string id,string name)
{
ViewData["chsword"] = name;
return View();
}
}
那当我在访问Url有 Eice/Index?id=1&name=aaaa时,name是可以取到的

 回复 引用 查看   
#20楼2010-05-04 10:51 | zhiqiongcang      
你好,为什么我运行的结果总是Route Tester页面?是不是哪里设置错了?谢谢
 回复 引用 查看   
#21楼[楼主]2010-05-04 12:53 | 重典      
@zhiqiongcang
看看你的Global文件里面设置的规则及是否使用了某些Filter