zoukankan      html  css  js  c++  java
  • MVC传值汇总

     方法一:

    Url传参是通过Get的方式,一般我们都是通过一定规则的Url来传参。比如下面的URL。

    http://localhost/contorller/action/?Params1=a&Params2=b

    public ActionResult Index(ExpModel model, string Params1 , string Params2)
    {
                ViewBag.P1 = Params1 ;
                ViewBag.P2= Params2;
                return View();
    }

    方法二:

    修改MVC3中的路由规则

    在Global.asax.cs中,修改路由规则

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
             "Default", // 路由名称
             "{controller}/{action}/{id}", // 带有参数的 URL
             new { controller = "Home", action = "Index", id = UrlParameter.Optional} // 参数默认值
    );

    MapRoute方法在RouteCollectionExtensions里有6个重载版本,有兴趣的可以研究这里里面的方法,这里我抽其中的一个进行

    public static Route MapRoute(    

      this RouteCollection routes,    

      string name,    

      string url,    

      Object defaults,    

      Object constraints,    

      string[] namespaces )

    name:路由在路由列表里的唯一名字(两次MapRoute时name不能重复)

    url:路由匹配的url格式

    defaults:路由url {占位符} 的默认值

    constraints:url的 {占位符} 的约束

    namespaces:这个是用于设置路由搜索的控制器命名空间

    比如,我们可以修改为下面的规则

     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
              "Default", // 路由名称
              "{controller}/{action}/{uid}_{token}_{others}.html", // 带有参数的 URL
              new { controller = "Home", action = "Index", uid = UrlParameter.Optional, token = UrlParameter.Optional,others = UrlParameter.Optional} // 参数默认值
    );

    如果访问的URL地址如:http://localhost/home/index/123_tokenvalue_othersvalue.html

    controller="Home", action="Index", uid=123, token=tokenvalue, others=othersvalue

    获取和上面的方法一样。

    OK,以上是抄别人的,来源我也忘了,百度吧,以下来点猛的

    上面的方式无非是URL的问题,而本质我们可以区分为GET/POST,但看这两种先,用的做多的

    区分Get和Post

    1、Get方法是用来向服务器上获取数据,而Post是用来向服务器上传递修改数据。

    2、Get将表单里的数据添加到action所指向的URL后面,并且两者之间使用”?”连接,而各个变量之间使用”&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值对象的方式,传递到所指向的action.

    3、Get是不安全的,因为在传输过程中,数据被放在请求的Url中,这样,用户可以直接在浏览器上看到提交的数据,一些系统内部信息也一同显示在用户面前。Post的所有操作对用户来说都是不可见的。

    4、Get传输的数据量小,主要是受限与于Url长度限制,其中IE浏览器对URL的最大限度为2083个字符。而post可以的传输大量的数据,所以在上传文件和大数据量时使用post。

    5、Form提交默认为Get方法提交(好吧,WebForm时代绝对是POST,MVC反转了)。

    6、Get方式获取数据后,刷新不会有负面的影响,因为它只是获取数据,而Post方法刷洗页面重复提交可能会产生不良的后果。

    具体使用如下代码:

    Home/Index.cshtml:
    <form action="/Home/Search" method="get">

    <input  type="text" name="query"/>
    <br />
    <input  type="submit" value="Seach"/>
    </form>

    Home/Search方法:
    public ActionResult Search(string query)

    Home/ Search.cshtml页面用于展示查询到的信息,代码略。

    运行效果图如下:

    (这个是效果图)http://localhost:2246/Home/Search?query=哈哈哈

    我们可以看到form的参数是直接显示到url后面的。

    而如果使用post方法,如:

    <form action="/Home/Search" method="post">

      <input type="text" name="query"/>

      <br />

      <input type="submit" value="Seach"/>

    </form>

    运行效果图:

    (这个是效果图)http://localhost:2246/Home/Search

    这里form表单数据是没有体现在url参数上面的。而此时我们刷新页面,会看到:

    (这个是效果图)"你所查找的网页要使用已输入的信息,返回此页可能需要重复进行的所有操作。。是否要继续操作?”"

    如果是向数据库里提交数据,刷新页面极有可能就同时提交了两次相同的数据了。

    再次说明,以上这个也是抄的,不过内容我精简了。以上的方式无非是POST或GET,Controller的写法一样,方法暴露参数。

    再来看猛料:

    MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下:

    一、Controller----------->View

    1、ViewData

    获取或设置一个字典,其中包含在控制器和视图之间传递的数据。使用ViewData是采用键值对的形式,对所定义的数据进行传递。在View中会自动识别到拥有唯一键值的ViewData,并将数据显示出来。

    例子:

     public ActionResult() {            

      List<Models.BlogArticle> list = (from d in db.BlogArticles where d.AIsDel == false select d).ToList();            

      //2将集合数据传给视图            

      // ViewBag.DataList = list;

      //viewBag形式            

       //利用viewdata形式            

      ViewData["DataList"] = list;              

      return View();

    }  

    视图中接收:

      <table id="tbList">        

      <tr>            

        <th>id</th>            

        <th>标题</th>            

        <th>分类</th>            

        <th>状态</th>            

        <th>时间</th>            

        <th>操作</th>        

      </tr>            

      <!--遍历Action方法,设置给ViewData的集合数据,生成html代码-->        

      @foreach (BlogArticle a in ViewData["DataList"] as List<BlogArticle>)        

      {            

        <tr>                

          <td>@a.AId </td>                

          <td>@a.ATitle </td>                

          <td>@a.ACate</td>                

          <td>@a.AStatu </td>                

          <td>@a.AUpdatetime </td>                

          <td>@a.AContent </td>                

           <td>                    

            <a href="javascript:del(@a.AId)">删</a>                    

            <a href="/home/modify/@a.AId">改</a>                

          </td>             

        </tr>          

      }    

    </table>  

    2、ViewBag

    获取视图包,允许自定义属性进行赋值,属于动态类型(dynamic),以ViewBag.属性=属性值得方式进行传值,其实这里跟ViewData的使用原理类似。

    例子:

    public ActionResult Index() {         

      ViewBag.Title="Hello!";

    }  

    视图中接收 <h1>ViewBag.Title</h1>

    3、其他方式

    在从controller向view传值时,除了以上两种方式外,还包括一些链接的方式,例如页面跳转的方式RedirectToAction,还有RenderAction等自动接收等方式。

    二、从View-------->Controller

    1、其实在这种情况下,通常会选择利用ajax来通过get或者post进行提交。如果采用最原始的JS来做,就要用到之前总结的ajax经典的五步工作法了,但是通常我们采用JQuery封装好的ajax提交方式。

    即$.ajax({type,url,data,success:function(){})其中最常用的就是这几个参数属性了。

    2、通过Get方式+路由配置+id值进行提交数据

     <td>                    

      <a href="javascript:del(@a.AId)">删</a>

     </td>  

    JS:

    <script type="text/javascript">       

      function del(id) {           

         if (confirm("您确定要删除吗?亲~~")) {               

          window.location = "/home/del/" + id;//通过get方式采用路由配置+id的形式           

        }       

      }    

     </script>  

    三、Action---------->Action

    前面两种传值方式都是在view和Controller之间进行数据传递,那么如果某一个业务需要用到后台的两个Action,并且需要再这两个Action之间进行数据传递,这时需要用到另一个概念TempData:获取要传递到视图的临时数据.使用时,需要注意TempData的生命周期,只在第一次请求Action时临时数据存在,之后自动变为NULL,具体的使用与ViewData相同,属于键值对的数据字典类。

    public ActionResult Index()     {        

      this.TempData["str"]="wyy";        

      return View();    

    }    

    public ActionResult Index2()     {        

      string name=this.TempData["str"];        

      return Content(name);    

    }  

    以上是在学习和实践MVC过程中经常用到的页面传值的几种方式,大的方向看来从C向V数据传递以ViewData为基础,扩展到ViewBag,更加方便快速了。

    从V到C传递,则归于ajax中的get和post的提交了。

  • 相关阅读:
    第二十四篇 玩转数据结构——队列(Queue)
    第二十三篇 玩转数据结构——栈(Stack)
    第二十二篇 玩转数据结构——构建动态数组
    第二十一篇 Linux中的环境变量简单介绍
    第二十篇 Linux条件测试语句相关知识点介绍
    第十九篇 vim编辑器的使用技巧
    第十八篇 Linux环境下常用软件安装和使用指南
    第十六篇 nginx主配置文件参数解释
    RAID磁盘阵列是什么(一看就懂)
    如何删除顽固文件或文件夹?
  • 原文地址:https://www.cnblogs.com/EasonJim/p/4843148.html
Copyright © 2011-2022 走看看