aspmvc_aspmvc视图 - CSDN
精华内容
参与话题
  • 在实际开发中经常会遇到项目需求中途发生变化或者项目完成后需要添加某些功能等问题。此时如果前期在设计时没有考虑到项目的扩展性和可维护性等问题...本课程学习的MVC框架具有良好的扩展性和可维护性,开发简单便捷。
  • 使用MVC框架开发网站(一)

    万次阅读 2018-06-08 10:31:44
    2.MVCASP.NET的区别 3.路由和URL导向 4.控制器和视图 5.模型与模型状态 6.过滤器 7……. 第1章_MVCASP.NET的区别 1.1概述 MVC是一种流行的Web应用架构技术,他把Web应用划分成Model、Controller和...

    概述

    本章您将学会:
    1.MVC的概念及使用
    2.MVC与ASP.NET的区别
    3.路由和URL导向
    4.控制器和视图
    5.模型与模型状态
    6.过滤器
    7…….

    第1章_MVC与ASP.NET的区别

    1.1概述

    • MVC是一种流行的Web应用架构技术,他把Web应用划分成Model、Controller和View三部分!
    • 优点:可测试,可维护等
      这里写图片描述
    • MVC是ASP.NET技术的子集(ASP.NETMVC)并列ASP.NETWebFrom

    这里写图片描述

    1.2本章主要内容

    这里写图片描述

    1.3MVC简介

    1.3.1MVC是什么

    (1)MVC是一种软件架构模式,针对具备人机交互功能的软件和程序
    (2)执行顺序如下:
    这里写图片描述
    Web开发的本质流程:请求->处理->响应

    1.3.2MVC的历史

    (1)1973年Trygve教授的两篇论文提出了如下软件设计思想:

    1)重写任何系统的能力
    2)模块化、可插入的透明子系统的存在
    3)每个系统的细分
    4)系统的可伸缩性
    在此基础之上,演变成了OOP思想

    (2)1978年Trygve教授在美国加州,进一步提炼思想,提出了MVC模式

    (3)至今,发展成为计算机科学中最受欢迎的应用程序模式之一

    (4)MVC的思想诞生的很久远,但是真正兴起是在WEB时代,

    Web才是MVC的真正土壤

    (5)当下流行的MVC架构

    1)RubyonRails(2004年7月24岁的美国人)
    2)Python世界的Django
    3)Java世界的Spring、Struts和JSF
    4)PHP世界的Zend

    1.3.3.NET中的MVC

    (1).NET在MVC方面一直比较落后
    (2)MonoRails一个开源的.NETMVC框架
    (3)微软公司的新作-Asp.netMvc(http://www.asp.net/mvc)
    (4)优势:
    1)汲取MonoRails的精华
    2)收编MVC大牛,博众家所长,07年底搞出一个版本
    3)集C#语言先进性(lambda、匿名类型和dynamic)
    4)生产力更高

    1.4第一个ASP.NETMVC程序

    1.4.1(现场展示)

    (1)步骤
    1.创建ASP.NETMVC项目
    2.创建Controller控制器
    3.创建View视图
    (2)引用:
    这里写图片描述
    (3)Content文件夹:
    这里写图片描述
    (4)Controllers文件夹:
    这里写图片描述
    (5)Models文件夹:
    这里写图片描述
    注:与三层结构的Models不同,他里可以放实体类、数据访问类和业务类等等
    (6)Scripts文件夹:
    这里写图片描述
    (7)Views文件夹
    这里写图片描述
    (8)Shared文件夹
    这里写图片描述
    注:任何控制器找不到的视图都会去找Shared下面的
    (9)Web.config
    这里写图片描述
    (10)Global.asax
    这里写图片描述
    注:应用程序启动时做一些任务

    1.4.2代码详解

    (1)Global.asax——应用程序启动注册路由
    当我对这个网站发出请求时,他是如何把我引到对应的控制器及里面的Action方法?
    答:首先网站一启动,会提前加载根据控制器和Action方法设置的路由规则,
    这样一请求,路由就会分析之后把你引到对应的控制器和Action方法

    这里写图片描述
    这里写图片描述
    (2)控制器
    这里写图片描述
    1)根据前面的解析,每次请求都是先定位控制器,然后再根据路由规则找到对应的Action方法!
    2)但是在路由表里,我们只写了Home,但是MVC框架约定,控制器都是以Controller结尾,并继承了基类Controller!
    3)在这里Index方法返回值类型是ActionResult,方法名和路由注册的方法名一致,在Index方法内,调用了View方法并且返回,这是一个重载的方法,可以给个参数,作为返回视图的名称,如果没有参数,默认就是以当前Action命名的视图。
    4)也就是Asp.netMVC架构,不像Java的MVC通过配置来建立关系,他是约定大于配置。

    (3)视图
    这里写图片描述
    1)视图里的代码类似于之前的ASPX里面的代码,主要是HTML、JS和CSS等前端技术构成,
    从MVC1.0到MVC5.0变化很大,razor语法越来越完善,强大!
    (4)向视图传递数据
    1)传统的方式,前置页面类和后置代码类是继承的关系,可以直接进行数据传递
    2)MVC模式下,视图和控制器是完全分离的,通过专用渠道
    ViewData,在控制器和视图之间传递数据的容器之一
    这里写图片描述
    这里写图片描述

    1.4.3ASP.NETMVC执行顺序

    这里写图片描述

    1.5MVC初步应用

    1.5.1实现学籍管理系统的登录

    这里写图片描述
    (1)特别不建议大家在视图中使用Web服务器端控件
    1)优点:事件模型支持,所见即所得!
    2)缺点:效率低,Html代码不纯粹!

    1.5.2ASP.NETMVC执行过程

    这里写图片描述

    1.5.3Model和三层架构

    注意:在MVC中如果它不属于View也不属于Controller,那么就把它归到Model中
    (1)MVC与三层架构之间有没有区别?
    1)MVC和三层架构没有必然的关系,架构的思想是不一样的
    2)三层架构强调特理分离(多个项目构成),MVC强调逻辑分离(一个项目构成)
    3)MVC中也可以体现三层架构
    4)有些MVC企业框架为了方便管理,会故意把Model做分层设计
    这里写图片描述

    1.6MVC与ASP.NET

    1.6.1ASP.NET与ASP.NETMVC

    (1)ASP.NETMVC是ASP.NET技术的子集
    (2)它在核心ASP.NET基础之上构建
    1.依赖于HttpHandler,如请求是如何进入控制器的
    2.依赖于Session、Cookie、Cache、Applaction等状态保持机制
    3.使用HttpContext、Request、Response、Server等对象
    4.在Controller使用智能感知很容易得到这些对象

    (3).NET中编写WEB程序的一种可选方式
    1.WebForms技术是另外一种可选方式

    1.6.2MVC与WebForms

    (1)WebForms的特色

    1)所见即所得,开发傻瓜化
    1.服务器端控件
    2.事件模型
    3.状态管理
    2)借鉴Winforms的成功特色
    3)偏离了Web请求处理的原量

    (2)Asp.netMVC的特色

    1)关注分离
    1.WebForm只是把一个页面分成了前置页面和后置代码,不够彻底
    2.MVC可以把一个页分成三块,分得更彻底
    2)可测试性
    3)开发更接近WEB的本质
    4)对开发人员的技术水平要求更高

    1.7 总结

    这里写图片描述

    展开全文
  • ASP.NET MVC 表单的几种提交方式

    千次阅读 2014-07-25 20:22:11
    下面是总结一下在ASP.NET MVC中表单的几种提交方式。   1.Ajax提交表单 需要引用          第1个为Jquery库, 其中第2,3个是验证的。第4个为Ajax提交所用到的。  其中注意一点,当 如果...

    下面是总结一下在ASP.NET MVC中表单的几种提交方式。

     

    1.Ajax提交表单

    需要引用

        <script type="text/javascript" src="/Scripts/jquery-1.7.2.min.js"></script>
        <script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
        <script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
        <script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script>

       第1个为Jquery库, 其中第2,3个是验证的。第4个为Ajax提交所用到的。

       其中注意一点,当<script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script> 如果你不小心引用了2个,

       会有什么后果呢? 你点击提交按钮的时候,提交了2次,不信你可以试试。

       具体代码如下:

      

    复制代码
     1 @using (Ajax.BeginForm("AddSubmit", "AdminInfo", new AjaxOptions { HttpMethod = "post" }))
     2         {
     3             <table class="table">
     4                 <tr>
     5                     <td colspan="2" class="TableTitle">创建管理员</td>
     6                 </tr>
     7                 <tr>
     8                     <td>@Html.LabelFor(m => m.UserName)</td>
     9                     <td class="td2">@Html.TextBoxFor(m => m.UserName)</td>
    10                 </tr>
    11                 <tr>
    12                     <td>&nbsp;</td>
    13                     <td class="td2">@Html.ValidationMessageFor(m => m.UserName)</td>
    14                 </tr>
    15 
    16                 <tr>
    17                     <td>@Html.LabelFor(m => m.PassWord)</td>
    18                     <td class="td2">@Html.PasswordFor(m => m.PassWord)</td>
    19                 </tr>
    20                 <tr>
    21                     <td>&nbsp;</td>
    22                     <td class="td2">@Html.ValidationMessageFor(m => m.PassWord)</td>
    23                 </tr>
    24 
    25                 <tr>
    26                     <td>@Html.LabelFor(m => m.TrueName)</td>
    27                     <td class="td2">@Html.TextBoxFor(m => m.TrueName)</td>
    28                 </tr>
    29                 <tr>
    30                     <td>&nbsp;</td>
    31                     <td class="td2">@Html.ValidationMessageFor(m => m.TrueName)</td>
    32                 </tr>
    33 
    34                 <tr>
    35                     <td>&nbsp;</td>
    36                     <td class="td2">
    37                         <input type="submit" value="提交" /></td>
    38                 </tr>
    39             </table>
    40         }
    复制代码

    如果你需要再表单中带其他参数则方法如下:

    @using (Ajax.BeginForm("AddSubmit", "AdminInfo", new {sid = Model.Id }, new AjaxOptions { HttpMethod = "post" }))

     

    2.Html直接提交,代码如下

       

    复制代码
    @using (Html.BeginForm("AddSubmit", "AdminInfo", FormMethod.Post))
            {
                <table class="table">
                    <tr>
                        <td colspan="2" class="TableTitle">创建管理员</td>
                    </tr>
                    <tr>
                        <td>@Html.LabelFor(m => m.UserName)</td>
                        <td class="td2">@Html.TextBoxFor(m => m.UserName)</td>
                    </tr>
                    <tr>
                        <td>&nbsp;</td>
                        <td class="td2">@Html.ValidationMessageFor(m => m.UserName)</td>
                    </tr>
    
                    <tr>
                        <td>@Html.LabelFor(m => m.PassWord)</td>
                        <td class="td2">@Html.PasswordFor(m => m.PassWord)</td>
                    </tr>
                    <tr>
                        <td>&nbsp;</td>
                        <td class="td2">@Html.ValidationMessageFor(m => m.PassWord)</td>
                    </tr>
    
                    <tr>
                        <td>@Html.LabelFor(m => m.TrueName)</td>
                        <td class="td2">@Html.TextBoxFor(m => m.TrueName)</td>
                    </tr>
                    <tr>
                        <td>&nbsp;</td>
                        <td class="td2">@Html.ValidationMessageFor(m => m.TrueName)</td>
                    </tr>
    
                    <tr>
                        <td>&nbsp;</td>
                        <td class="td2">
                            <input type="submit" value="提交" /></td>
                    </tr>
                </table>
            }
    复制代码

    如果你需要再表单中带其他参数则方法如下:

     @using (Html.BeginForm("AddSubmit", "AdminInfo", new { sid = 1 }, FormMethod.Post))

     

    3.你可以自己写Jquery提交表单,详细Jquery大家都是会写的,这里就不详细说明了   0-0

     

    展开全文
  • asp.net MVC 权限设计

    千次阅读 2016-08-18 12:00:59
    几点说明:    1、该权限系统是个网站用的,用户简单,因此不涉及到部门这些信息  2、基于将角色与controller、action相关联来判断用户是否有权  3、通过重载AuthorizeAttribute实现 ... Name

    几点说明:

     

        1、该权限系统是个网站用的,用户简单,因此不涉及到部门这些信息

        2、基于将角色与controller、action相关联来判断用户是否有权

        3、通过重载AuthorizeAttribute实现

     

    数据库设计:


    表说明

     

    ControllerAction 

    1.     Name是controller的名称
    2.     IsController是指是否是controller,如果为false,表示存的是action,那么controllerName字段就派上用场了
    3.     IsAllowedNoneRoles是指是否允许没有权限的人访问
    4.     IsAllowedAllRoles是指是否允许有角色的人访问

    IsAllowedNoneRoles,IsAllowedAllRoles实现了允许所有人访问以及允许所有注册用户访问:),并且我们约定,IsAllowedNoneRoles具有最高的优先级,其次是IsAllowedAllRoles,然后才是ControllerActionRole中定义的规则

     

     

    ControllerActionRole

     IsAllowed表示该action或者controller是否允许访问,加入表中有两条记录

    角色 Name ControllName IsAllowed IsController
       A Admin Home false false
       A Home Null true true

         这里约定分两个层次来判断权限:

              第一条记录:表示A角色不能访问 Home/admin

              第二条记录:表示A角色可以访问Controller下的所有方法

         到底能不能访问呢?其实,我们以action为准,如果定义了action,我们直接从action的约定来判断,因此这里判断A不能访问Home/admin

     

     其他几张表一看就明白,不再多说

     

    判断是否有权限的设定

     

        1、获取controller,action,以及存放在session中的用户信息

    public class UserAuthorizeAttribute : AuthorizeAttribute 
        {
    
         public override void OnAuthorization(AuthorizationContext filterContext) 
          { 
              var user = filterContext.HttpContext.Session["CurrentUser"] as User; 
              var controller = filterContext.RouteData.Values["controller"].ToString(); 
              var action = filterContext.RouteData.Values["action"].ToString(); 
              var isAllowed = this.IsAllowed(user, controller, action); 
    
              if (!isAllowed) 
              { 
                  filterContext.RequestContext.HttpContext.Response.Write("无权访问"); 
                  filterContext.RequestContext.HttpContext.Response.End(); 
              } 
    
          }
    
        ……
    
    }

    2、检索数据库ControllerAction表中有没有Name为第一步中controller 的记录,如果没有,我们约定这个controller是不需要进行权限控制的,如果有的话,进入第三步

     

       3、前面提到了,我们约定对权限的控制分为两个层次,controller和action层次,如果同时定义了,以action为准。因此,我们需要判断是否在数据库中有action的记录,如果有,进入4,无,进入5

    bool IsAllowed(User user, string controllerName, string actionName) 
    { 
        var service = ServiceLoader.LoadService<ToySpirit.IToySpiritService.IControllerActionService>(); 
    
        // 获取对应的controller 
         var controller = service.GetSingleByExpression(c => c.Name == controllerName && c.IsController); 
        if (controller != null) 
        { 
            // 获取对应的action 
             var controllerAction = service.GetSingleByFunc(c => c.Name == actionName && c.IsController == false && c.ControllerName == controllerName); 
    
            return controllerAction == null ? this.isAllowed(user, controller) : this.isAllowed(user, controllerAction); 
        } 
    
        // 没有定义controller的权限,表示无需权限控制 
         return true; 
    }

    4、如果有action的记录,那么我们首先判断controllerAction 拒绝哪些角色访问,如果用户有角色在这里面,很遗憾,就不能访问了;然后判断controllerAction 允许哪些角色访问,如果用户的角色在这里面,就可以访问了

    注:这里很有可能用户有多个角色,比如A,B,C,如果A不能访问controllerAction,那么很遗憾,用户不能访问,尽管角色B,C可能可以访问该controllerAction

    5、没有action的记录,自然就检查controller对应的controllerAction 了

    代码
    
    4、5判断的代码是一样的,如下:
    
          private bool isAllowed(User user, ControllerAction controllerAction) 
            { 
                // 允许没有角色的:也就是说允许所有人,包括没有登录的用户 
                if (controllerAction.IsAllowedNoneRoles) 
                { 
                    return true; 
                } 
    
                // 允许所有角色:只要有角色,就可以访问 
                if (controllerAction.IsAllowedAllRoles) 
                { 
                    return user.Roles.Count > 0; 
                } 
    
                if (user == null || user.Roles.Count == 0) 
                { 
                    return false; 
                } 
    
                // 选出action对应的角色 
                var roles = controllerAction.ControllerActionRoles.Select(ca => ca.Role).ToList(); 
                if (roles.Count == 0) 
                { 
                    // 角色数量为0,也就是说没有定义访问规则,默认允许访问 
                    return true; 
                } 
    
                var userHavedRolesids = user.Roles.Select(r => r.ID).ToList(); 
    
                // 查找禁止的角色 
                var notAllowedRoles = controllerAction.ControllerActionRoles.FindAll(r => r.IsAllowed == false).Select(ca => ca.Role).ToList(); 
                if (notAllowedRoles.Count > 0) 
                { 
                    foreach (Role role in notAllowedRoles) 
                    { 
                        // 用户的角色在禁止访问列表中,不允许访问 
                        if (userHavedRolesids.Contains(role.ID)) 
                        { 
                            return false; 
                        } 
                    } 
                } 
    
                // 查找允许访问的角色列表 
                var allowRoles = controllerAction.ControllerActionRoles.FindAll(r => r.IsAllowed).Select(ca => ca.Role).ToList(); 
                if (allowRoles.Count > 0) 
                { 
                    foreach (Role role in allowRoles) 
                    { 
                        // 用户的角色在访问的角色列表 
                        if (userHavedRolesids.Contains(role.ID)) 
                        { 
                            return true; 
                        } 
                    } 
                } 
    
                return false; 
            }


    使用方法:

     

    建立一个basecontroller,使用我们定义好的UserAuthorize,然后所有的controller继承basecontroller就可以了

    /// <summary> 
       /// 控制基类 
       /// </summary> 
        [UserAuthorize] 
       public abstract class BaseController : Controller 
       {}
    
       public class HomeController : BaseController{}

    示:

     

    在controlleraction中添加几条数据:


    根据我们的规则,我们可以知道,未登录的用户可以访问Home/Public,其他几个页面则不能访问

    我们看对应的Action:

    public void ViewPage() 
           { 
               Response.Write("View"); 
           } 
           public void Public() 
           { 
               Response.Write("Public"); 
           } 
           public void Delete() 
           { 
               Response.Write("Delete"); 
           }

    访问Home/Public,如果有权限,那么显示“Public“,否则显示”无权访问”

    未登录用户访问Home/Public,结果符合我们的约定;-)



    展开全文
  • ASP.NET MVC + Jquery + Layui实战入门

    千次阅读 2019-05-26 18:54:14
    大家好,我最近正计划出一期关于ASP.NET的实战课程,这里做一个简单的介绍。项目是关于财务分析的,采用ASP.NET MVC,开发工具我用的是VS2017企业版,以及SQLServer 2012

    大家好,我最近正计划出一期关于ASP.NET的实战课程,这里做一个简单的介绍。项目是关于财务分析的,采用B/S的模式,分为前台应用端和后台管理端,分别是给游客和管理员使用的。

    课程目录如下:

     

    网站架构为ASP.NET MVC,这个技术现在已经很成熟了,也是很多公司要求必会的一门.NET技术。它的架构如下:

    开发工具我用的是VS2017企业版,以及SQLServer 2012,SVN

    课程的大纲预计会分为以下几个部分:

    1. 项目的介绍,灵感来源,它有什么用?

    2. 本课程的目标人群有哪些?

    3. 安装VS2017和SQL Server 2012配置

    4. 搭建项目,下载前端库,开始构建前台界面和后台界面

    5. 开发前台界面,并生成对应的模型和数据表

    6. 开发后台界面,并生成对应的模型和数据表

    7. 测试程序,并优化

     

    展开全文
  • ASP.net MVC5 简介

    千次阅读 2017-06-21 12:46:34
    ASP.net MVC5 简介MVC是什么MVC是一种设计模式。 也就是Model-View-Controller 模型-视图-控制器。Model的功能Model试数据模型,用来封装与程序相关的数据,以及对数据操作的处理方法。 有关“数据处理”的范围都...
  • asp.net + MVC5 入门完整教程一

    万次阅读 多人点赞 2018-05-24 17:44:02
    概述本系列文章及文章中的例子主要基于微软官方文档使用工具 : VS2014 + sqlServer 2014开始主要讲解MVC使用,后续同样也会提供MVC + ADO.NET的实现方案概念介绍 MVC,Model – View – Controller 的简写 Model ...
  • ASP.NET MVC三层架构基础详细操作图文教程(VS2017)(1)

    万次阅读 多人点赞 2018-02-27 11:40:29
    参照原文地址:ASP.NET三层架构基础详细操作图文教程(一)作者:乔杨 出自:http://www.cnntec.com 作者:AZ猫 转发请注明出处,违者必究本文主要讲述Asp.net MVC B/S结构 下基础的三层架构项目。三层主要是指的...
  • mvc(1)——新建一个ASP.NET MVC项目

    千次阅读 热门讨论 2018-07-23 12:49:12
    一、新建一个空MVC项目  对于mvc的应用,我想第一步就应该是建立一个mvc项目了。废话不说了,直接上。  在“File(文件)”菜单中选择“New(新建)”——“Project(项目)”  打开“NewProject(新项目)...
  • 许多ASP.NET开发人员开始接触MVC认为MVCASP.NET完全没有关系,是一个全新的Web开发,事实上ASP.NET是创建WEB应用的框架而MVC是能够用更好的方法来组织并管理代码的一种更高级架构体系,所以可以称之为ASP.NET MVC...
  • ASP.NET + MVC5 入门完整教程三 (上) ---第一个MVC项目

    万次阅读 多人点赞 2018-05-28 09:41:59
    第一个MVC应用程序1创建MVC项目打开VS ,File--新建--项目,选择ASP Web项目,命名后确认。选择(Empty)空模板,项目创建完成,会看到 解决方案管理器 窗口显示一些文件夹,如图,这是一个MVC的默认结构2 添加第一...
  • Asp.net MVC3.0安装包下载地址

    万次阅读 2011-10-28 15:40:00
    Asp.net MVC3.0已经发布了,最近才准备学习MVC,说来感觉自己太落后了。今天提供下MVC3.0安装包下载地址,也标志着我正式开始MVC的学习。 由于这一个月左右,要进行一个排期项目的开发,学习进度可能会变得非常慢。...
  • 自学MVC看这里—全网最全的MVC教程

    千次阅读 2018-05-03 18:11:36
    MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC。小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口。本文从Why,What,How三个角度整理MVC ...
  • asp.net mvc5 安装

    万次阅读 2014-07-31 16:09:25
    asp.net mvc5 安装
  • 全国首部Asp.net MVC5 视频课程

    万次阅读 2017-05-15 09:54:09
    全国首部Asp.net MVC5 视频课程 CSDN: http://edu.csdn.net/course/detail/4325
  • 自学MVC看这里——全网最全ASP.NET MVC 教程汇总

    千次阅读 多人点赞 2016-06-22 10:47:54
    MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC。小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口。本文从Why,What,How三个角度整理MVC ...
  • MVC按钮单击事件写法

    万次阅读 2016-08-02 13:09:58
    Views Controllers public ActionResult Login(string queren) { if (queren == "确认") { } return View(); }
  • ASP MVC 后台控制器弹出框提示

    万次阅读 2015-05-22 21:29:06
    提示框点击确定后页面变成空白页面 return Content("alert('请先登录');"); 提示框点击确定后页面变成你想要的页面(如实原页面怎会... return Content("alert('请先登录');window.location.href='../home/index';...
  • ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作   ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面   ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第三篇
  • ASP.NET MVC视频资源分享

    千次阅读 2018-09-20 19:58:17
    点击打开链接 密码:il99 是一个新闻管理的项目  
1 2 3 4 5 ... 20
收藏数 106,854
精华内容 42,741
关键字:

aspmvc