首页 > 代码库 > MVC中V与C之间的通话

MVC中V与C之间的通话

 

 无论是MVC还是三层,还是其他的一些框架应用,只不过是在业务处理上划分的更加的清晰明了,降低各个模块之间的耦合度。但是各个模块之间又是如何进行通信的呢?下面主要来谈一下MVC中View层与Controller之间的通信。


 ModelBinding机制

 在MVC中为我们方便的提供了一种叫做模型绑定机制的东西,总的来说就是在每个VIEW中,只能绑定一个Model实体,有了这种绑定的机制,就可以很方便的实现View与Controller之间的通信。如下所示:

 Controller层

 

<span style="font-family:SimSun;font-size:18px;"> /// <summary>
        /// 用来实现当加载页面的时候想页面传递参数
        /// </summary>
        /// <param name="user">实体类</param>
        /// <returns></returns>
        public ActionResult Delete(User user)
        {
            //为实体类赋值
            user.className = "5465";
            user.ID = "4457547";
            user.Name = "214";
            //把实体类传递到View中
            return View(user);
        }</span>


 View层代码

<span style="font-family:SimSun;font-size:18px;"><!--指定了 model 类型的视图 就叫做强类型视图,好处:vs可以直接推断出model的类型,从而提供只能提示-->
 @*@model ChanDicanshu.Models.User*@
@using ChanDicanshu.Models

@{
    ViewBag.Title = "Delete";
}

<h2>Delete</h2>
@*//因为有绑定机制,所以可以直接输出*@
@Model.className
<br />
@*//这里的model就是绑定的实体*@
@Model.ID
<br />
@Model.Name</span>

 基本上就这么简单,通过模型绑定机制,方便的实现了View和Controller之间通过Model实体来进行相互通信。上述有两种方式。一种是当使用的时候绑定,一种时直接绑定强类型视图。


 路由机制传递参数

 先看一下MVC中的路由机制

 

<span style="font-family:SimSun;font-size:18px;">  public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            //忽略给定路由列表指定的URl路由
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                //路由名称
                name: "Default",
                 //Url地址
                url: "{controller}/{action}/{id}",
                //默认的路由地址
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional}
            );
        }
    }</span>

 在MVC中就是通过这么一个识别地址的方式来查找到底使用那个Controller中的那个方法,最后来显示那个视图。通过这种途径,我们也可以来实现View层与Controller之间传递参数,实现起来也特别的简单,只要名字相同就可以识别。


 View层代码

<span style="font-family:SimSun;font-size:18px;"><html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
  
    @*连接到相同的Controller下的Show方法中,传递的参数为id*@
    @Html.ActionLink("删除", "show", new { id = "123"})

</body>
</html></span>


 我们在View层只定义了一个链接的操作,最后会连接到相同Controller下的show方法中,但是还有传递的参数。如果你细心的话,看地址的话,会发现/Home/show/123,123就代表我们所要传递的参数。我们如何来获得呢。


 Controller层代码

<span style="font-family:SimSun;font-size:18px;">   /// <summary>
        /// 路由机制来获得传递参数
        /// </summary>
        /// <param name="id">这就是传递过来的参数,只要名字相同就可以识别</param>
        /// <returns></returns>
        public ActionResult Show(int id)
        {        
            return View();
        }</span>

 Request和FormCollection

 在上一篇博客中也曾提到过,通过这两个对象就可以获取表单上的数据,方便了View和Controller之间的交互。

 

 



MVC中V与C之间的通话