MVC学习——M/V/C分工模式

学习自:http://www.cnblogs.com/QLeelulu/archive/2008/09/30/1302462.html

http://www.cnblogs.com/youring2/archive/2011/07/06/2091715.html


一、新建一个ASP.NET.MVC,内容如下:


在不对项目进行任何修改的情况下,直接按CTRL+F5,运行项目,运行结果如下:


这是一个404错误,指定的页面未找到。在项目运行时,Mvc3会将页面请求进行映射。接下来我们为项目添加一个Home页。

添加一个名为Home的控制器:


控制器的名称必须以Controller为结尾。

然后修改HomeController中的代码:

public string Index()
{
return"<h1>Hello world by Mvc3</h1>";
}

运行之后:


修改控制,添加一个名为Welcome的方法,代码如下:

public  ActionResult Welcome()
{
return  View();
}

在Welcome方法的代码块中,点击右键,在上下文菜单中选择“添加视图”,打开添加视图对话框:

在这个对话框中不做任何修改,点击“添加”按钮,完成视图的添加,VS会在View文件夹下床架如下结构的文件:

编译项目,在浏览器地址栏中输入地址:http://localhost:xxx/home/Welcome(xxx为端口号,在不同的计算机中会有所不同),运行结果如下:

  step6.使用ViewBag传递参数

继续修改控制器中的Welcome方法,为它添加一个名为name的string类型参数,修改后的代码如下:

public  ActionResult Welcome( string  name = "" )
{
ViewBag.name 
=  name;
return  View();
}

  我们在这里使用了ViewBag属性,它是一个新的MVC3属性,MVC2 中的控制器支持 ViewData 属性,允许通过后绑定的字典将数据传送给视图模板,在 MVC3 中,你可以通过 ViewBag 来更加简单的完成。例如,对于 ViewData["Message"] = "text",你可以通过 ViewBag.Message = "text" 来完成。你不需要通过类来定义任何强类型的属性,因为这是动态属性,在内部,ViewBag 属性以名-值对的形式保存在 ViewData 字典中。注意,在许多预发布版本中,这个属性被称为 ViewModel。

  相应的,我们修改View中的代码,修改后的代码如下:

@{
ViewBag.Title 
= " Welcome " ;
}

< h2 > Hi @ViewBag.name, you ' re welcome!</h2>

ViewBag.Title是用来显示当前页面的标题的。

ViewBag.name使我们在控制器中添加的属性,在这里可以直接使用。

编译项目,修改刚才在浏览器中输入的地址,为它添加一个名为name的参数,地址如下:http://localhost:xxx/home/Welcome?name=Tom,运行界面如下:

  你也可以试试不加参数的情况,直接使用地址:http://localhost:xxx/home/Welcome,程序也是可以正常运行的,只不过输出的结果为“Hi , you're welcome!”,这时因为我们为参数name指定了默认值,它变成了一个可选的参数,在没有传入参数的时候,会采用默认值“空字符串”,所以会有这个输出结果。

二、是怎样根据地址栏的URL输出呢??

我们看到Views中Home下有Welcome.cshtml:

如果我们将路径写成:http://localhost:12183/Views/Home/Welcome.cshtml,会出现下面的情况:


Oh,No!路径是对的,文件也存在,但为什么会是404,说找不到文件呢?如果不是直接访问存在的物理文件,那么MVC又是怎样工作的呢?

原来MVC模式是这样工作的:
image

在MVC中,客户端的所请求的URL是被映射到相应的Controller去,然后由Controller来处理业务逻辑,或许要从Model中取数据,然后再由Controller选择合适的View返回给客户端。再说回前面我们运行的ASP.NET MVC程序访问的http://localhost:2176/Home/Index这个URL,它访问的其实是HomeController中的Index这个Action,见下图:

image

其中public ActionResult Index()这个方法称为Controller的Action,他返回的是ActionResult的类型。一个Controller可以有很多个Action。


我们知道了一个URL是怎样定位到相应的Controller中去的了,那么View又是怎么被返回给客户端的呢?我们从前面的截图中看到,Controller中的Action方法中有个return View()的方法。默认情况下它会返回与Action同名的view.在ASP.NET MVC默认的视图引擎(WebFormViewEngine)下,view是按如下路径访问的:

/Views/{Controller}/{Action}.aspx

也就是说对于http://localhost:2176/Home/Index这个路径,在默认情况下,在Index这个Action中用return View()来返回view的时候,会去寻找/Views/Home/Index.aspx文件,如果找不到这个文件,就会去Share目录中寻找:/Views/Share/Index.aspx,如果都找不到,就会抛出找不到View的异常。return View("lulu.aspx")来指定要返回哪一个view:/Views/Home/lulu.aspx。

那么为什么前面我们直接访问Views/Home/Index.aspx这里文件的时候会出现404错误,说找不到文件呢?因为在MVC中,是不建议直接去访问View的,所以我们建立的ASP.NET MVC程序在默认情况下就在Views目录下加了一个web.config文件,内容如下:

image

也就是访问Views目录下的所有的文件都会由System.Web.HttpNotFoundHandler来处理,所以请不要将资源文件(CSS、JS、图片等)放到Views目录中。如果你确实要放到Views目录下的话,请修改Views/web.config文件。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值