精华内容
下载资源
问答
  • 开始之前,你有必要先用ASP探针测试下服务器对FSO组件的支持情况,通常我们使用的是Windows 2003系统的服务器。 下面说下我的具体解决思路,对每一种可能会产生报错的原因都作了相应分析,希望对
  • 数据传输对象通常称为DTO)通常是POCO(普通旧CLR对象)类的实例,... 本文讨论了为什么我们应该使用数据传输对象以及如何在ASP.NET Core 3.1中使用它们。 若要使用本文提供的代码示例,您应该系统安装Visua...

    数据传输对象(通常称为DTO)通常是POCO(普通旧CLR对象)类的实例,用作容器来封装数据并将其从应用程序的一层传递到另一层。 通常,您会发现服务层中正在使用DTO将数据返回到表示层。 使用DTO的最大优点是将客户端与内部数据结构分离。

    本文讨论了为什么我们应该使用数据传输对象以及如何在ASP.NET Core 3.1中使用它们。 若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019

    [ 也在InfoWorld上:隔离期间最好的免费数据科学课程 ]

    创建一个ASP.NET Core 3.1 API项目

    首先,让我们在Visual Studio中创建一个ASP.NET Core项目。 假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建一个新的ASP.NET Core API项目。

    1. 启动Visual Studio IDE。
    2. 点击“创建新项目”。
    3. 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
    4. 点击下一步。
    5. 在“配置新项目”窗口中,指定新项目的名称和位置。
    6. 单击创建。
    7. 在接下来显示的“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 3.1(或更高版本)。
    8. 选择“ API”作为项目模板以创建新的ASP.NET Core API应用程序。
    9. 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不使用这些功能。
    10. 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
    11. 单击创建。

    这将在Visual Studio中创建一个新的ASP.NET Core API项目。 在本文的后续部分中,我们将使用该项目来处理数据传输对象。

    为什么要使用数据传输对象(DTO)?

    在设计和开发应用程序时,如果您使用模型在各层之间传递数据并将数据发送回表示层,那么您将公开应用程序的内部数据结构。 那是您应用程序中的主要设计缺陷。

    通过分离各层,DTO使您在实现API,MVC应用程序以及诸如Message Broker之类的消息传递模式时更加轻松。 当您想通过导线传递轻型物体时,DTO是一个不错的选择,尤其是当您通过带宽受限的介质传递物体时。

    使用DTO进行抽象

    您可以利用DTO从用户界面或表示层抽象应用程序的域对象。 这样,应用程序的表示层便与服务层分离了。 因此,如果您想更改表示层,则可以轻松完成此操作,而应用程序将继续与现有域层一起使用。 同样,您可以更改应用程序的域层,而不必更改应用程序的表示层。

    使用DTO进行数据隐藏

    您想要使用DTO的另一个原因是数据隐藏。 也就是说,通过使用DTO,您只能返回请求的数据。 例如,假设您有一个名为GetAllEmployees()的方法,该方法返回与所有雇员有关的所有数据。 让我们通过编写一些代码来说明这一点。

    在我们之前创建的项目中,创建一个名为Employee.cs的新文件。 在此文件中编写以下代码,以定义名为Employee的模型类。

    public class Employee
        {
            public int Id { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string DepartmentName { get; set; }
            public decimal Basic { get; set; }
            public decimal DA { get; set; }
            public decimal HRA { get; set; }
            public decimal NetSalary { get; set; }
        }

    请注意,Employee类包含的属性包括Id,FirstName,LastName,Department,Basic,DA,HRA和NetSalary。 但是,表示层可能只需要GetAllEmployees()方法中员工的Id,FirstName,LastName和Department Name。 如果此方法返回List <Employee>,则任何人都可以看到该员工的薪水详细信息。 你不要那样

    为避免此问题,您可以设计一个名为EmployeeDTO的DTO类,该类仅包含所请求的属性(例如Id,FirstName,LastName和Department Name)。

    在C#中创建DTO类

    为此,请创建一个名为EmployeeDTO.cs的文件,并在其中编写以下代码。

    public class EmployeeDTO
        {
            public int Id { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string DepartmentName { get; set; }
        }

    现在可以使用模型和数据传输对象类,您可能想要创建一个包含两个方法的转换器类:一个将Employee模型类的实例转换为EmployeeDTO的实例,(反之亦然)一个将实例转换为EmployeeDTO的实例。 EmployeeDTO到Employee模型类的实例。 您还可以利用AutoMapper(一种流行的对象到对象映射库)来映射这两种不同的类型。 您可以在此处阅读有关AutoMapper的更多信息

    您应该在应用程序的服务层中创建List <EmployeeDTO>,并将集合返回到表示层。

    DTO的不变性

    DTO旨在将数据从应用程序的一层传输到另一层。 DTO的使用者可以用.NET / C#/ Java甚至JavaScript / TypeScript构建。 DTO通常是序列化的,因此它可以独立于接收器中使用的技术。 在大多数情况下,数据的接收者不需要在收到后修改该数据,理想情况下不需要!

    这是不变性重要性的经典示例。 这就是为什么DTO应该是不变的!

    您可以通过多种方式在C#中实现不可变DTO。 您可以使用ReadOnlyCollection或System.Collections.Immutable命名空间中存在的线程安全的不可变集合类型。 您还可以利用C#9中的记录类型来实现不可变的DTO。

    域驱动的设计期望域对象在外部是不可变的。 这是使您的DTO不可变的一个很好的理由,不是吗?

    DTO序列化挑战

    您应该能够无缝地对DTO进行序列化/反序列化,以便可以将DTO向下传递。 但是,实际上,在使用DTO时,您可能必须解决一些序列化问题。 在实际应用程序中,您可能有多个实体或模型类,并且每个实体或模型类可能相互引用。

    假设您已经为组织中的员工构建了考勤管理系统。 通常,您的应用程序中可能有一个名为Employee的类,它引用User类(即Employee是应用程序的用户),而该类又引用了Role类。 角色类可能引用Permission类,而后者又可能引用PermissionType和PermissionGroup类。 现在,当序列化Employee类的实例时,您还将最终序列化这些对象。 很容易看到,在某些复杂的情况下,您可能最终会序列化几种类型。

    在这里可以轻松进行惰性加载或异步加载。 此功能可以帮助您仅在需要时才加载实体。 有关如何执行延迟加载的更多信息,请查看我有关C#中的延迟初始化的文章。

    数据传输对象通常不包含任何业务逻辑-它们仅包含数据。 在使用DTO时,不变性是一个理想的功能。 有几种方法可以实现不可变的DTO。 我将在后面的文章中讨论C#中的不变性。

    如何在ASP.NET Core中执行更多操作:

    翻译自: https://www.infoworld.com/article/3562271/how-to-use-data-transfer-objects-in-aspnet-core-31.html

    展开全文
  • IIS接到一个新的http请求后,最终会调用asp.net_isapi.dll的 ISAPI扩展(特指IIS6.0环境,iis7.0的应用程序池默认为集成方式,相对有所变化),然后传递到httpRuntime Pipe(http运行时管道),Asp.Net这时才开始运行...
  • ASP.NET的六大对象介绍

    千次阅读 多人点赞 2018-11-11 16:54:06
    ASP.NET含义: 1.Request对象:  简单.NET程序示例 1: 示例2 : 2.Response对象: 示例2: 3.Server对象  示例3:HtmlEncode,HtmlDecode,MapPath 4.Session对象 示例4: Session练习1:从初始页面传2...

    目录

    ASP.NET含义:

    1.Request对象:

     简单.NET程序示例 1:

    示例2 :

    2.Response对象:

    示例2:

    3.Server对象

     示例3:HtmlEncode,HtmlDecode,MapPath

    4.Session对象

    示例4:

    Session练习1:从初始页面传2个整数到Receive.aspx页面进行相加。

    session练习2:

    Session练习3:购物车

    5.Application对象

    例子1

    6.ViewState对象-暂不介绍

    综合示例:聊天室

     


    ASP.NET含义:

             ASP(Active Server Pages,活动服务器网页)是Microsoft公司推出的一项动态网页开发技术。       

            ASP既不是一种语言,也不是一种开发工具,而是一种技术框架,其主要功能是把脚本、HTML、组件和Web数据库访问功能有机地结合在一起,形成一个能在服务器端运行的应用程序,该应用程序可根据来自浏览器端的请求生成相应的HTML文档并回送给浏览器。

    获取静态网页过程:

     客户端动态网页:

    服务器端动态网页:

    ASP.NET内置对象:

    Request对象

    封装了浏览器向Web服务器发送的HTTP请求消息

    Response对象

    封装了Web服务器向浏览器发送的HTTP响应消息

    Server对象

    提供对服务器上的方法和属性进行的访问

    Session对象

    用于存储特定用户会话所需的信息

    Application对象

    代表运行在Web服务器上的ASP.NET应用程序

    ViewState对象

    仅在页面提交到服务器之前有效,保存页面的状态信息,如页面当前页码

     

    1.Request对象:

          Cookies:获取客户端发送的cookie的集合

          Form:获取窗体变量集合

          QueryString:获取HTTP查询字符串变量集合

       读取单值Cookie:

    <%=Request.Cookies["myCookie“]%><br>
    <%=Request.Cookies["myCookie“]["Name“]%><br>
    

     简单.NET程序示例 1:

    Default.aspx:

    <body>
    <form id="form1" runat="server" >
         <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
         <asp:Button ID="Button1" runat="server"  PostBackUrl="~/Receive.aspx" Text="提交" />        
    </form>
    </body>

    Receive.aspx:

    <body>
    <form id="form1" runat="server">
        <asp:Label ID="Label1" runat="server" Text="传过来的值="></asp:Label> 
        <%=Request.Form["TextBox1"]%>
    </form>
    </body>

    对比以下代码(实现的功能都是一样的):

    Default.aspx:

    <body>
    <form id="form1" runat="server" method="get">
         <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
         <asp:Button ID="Button1" runat="server"  PostBackUrl="~/Receive.aspx" Text="提交" />        
    </form>
    </body>

    Receive.aspx:

    <body>
    <form id="form1" runat="server">
        <asp:Label ID="Label1" runat="server" Text="传过来的值="></asp:Label> 
        <%=Request.QueryString["TextBox1"]%>
    </form>
    </body>

    =》

    例1.1(对比以上例子,主要看是如何传值的)(初学时可忽略下面这个例子)

    Default.aspx:

    <body>
      <form id="form2" runat="server"  >
         <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
         <asp:Button ID="Button1" runat="server" OnClick ="Button1_Click" Text="提交" />        
      </form>
    </body>

    Default.aspx.cs:

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Receive.aspx?param="+TextBox1 .Text );
        }

    Receive.aspx:

    <body>
      <form id="form1" runat="server">
          <asp:Label ID="Label1" runat="server" Text="传过来的值="></asp:Label> 
          <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
      </form>
    </body>

    Receive.aspx.cs:

        protected void Page_Load(object sender, EventArgs e)
        {
            TextBox2.Text = Request.Params["param"];
        }

     =》

    示例2 :

    Default.aspx

    <body>
        <form id="form1" runat="server" method="post">
                <font size="6">登录信息</font><br/>
                 用户名<asp:TextBox ID="s_name" runat="server"></asp:TextBox> <br/>
                 密 码<asp:TextBox ID="s_password" runat="server" TextMode="Password"/> <br />
             <asp:Button ID="Button1" runat="server" Text="登陆" PostBackUrl="~/Receive.aspx" />
    </form>
    </body>

     

    Receive.aspx

    <body>
     <form id="form1" runat="server">
         <% string strname,strpassword;
           strname=Request.Form["s_name"];
           strpassword=Request.Form["s_password"];
          %>
      返回用户注册信息:<br />
      用户名:<%=strname%><br/>
      密  码:<%=strpassword%><br/>
    </form>
    </body>

    =>

    2.Response对象:

       Redirect:将客户端重定向到新的URL

       Write:将信息写入HTTP内容输出流

       End:将当前所有缓冲的输出发送到客户端,停止该页的执行

    示例2:

    Default.aspx

    <body>
        <form id="form1" runat="server">
            <table>
                <tr>
                    <asp:Button ID="NoParamsBtn" runat="server" Text="跳转到Dir.aspx(没有参数)" OnClick="NoParamsBtn_Click"/><br />
                    <asp:Label ID="Label1" runat="server" Text="参数:"></asp:Label><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
                    <asp:Button ID="HaveParamsBtn" runat="server" Text="跳转到Dir.aspx(有参数)" OnClick="HaveParamsBtn_Click" />
                </tr>
            </table>
        </form>
    </body>

    Default.aspx.cs

            protected void NoParamsBtn_Click(object sender, EventArgs e)
            {
                Response.Redirect("~/Dir.aspx");
            }
    
            protected void HaveParamsBtn_Click(object sender, EventArgs e)
            {
                Response.Redirect("~/Dir.aspx?param="+Server .UrlEncode (TextBox1 .Text ));
            }

     Dir.aspx

    <body>
        <form id="form1" runat="server">
            <div>
                <asp:Label ID="Label1" runat="server" Text="参数:"></asp:Label><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            </div>
        </form>
    </body>

     Dir.aspx.cs

            protected void Page_Load(object sender, EventArgs e)
            {
                if(Request .Params ["param"]!=null)
                {
                    TextBox1.Text = Request.Params["param"];
                }else
                {
                    TextBox1.Text = "没有收到数据";
                }
            }

     

    3.Server对象

    属性名称

    说    明

    MachineName

    获取服务器的计算机名称

    ScriptTimeout

    获取和设置请求超时

    方法名称

    说    明

    Execute

    执行另一个aspx页,执行完该页后再返回本页继续执行

    Transfer

    终止当前页的执行,并为当前请求开始执行新页

    HtmlEncode

    对要在浏览器中显示的字符串进行HTML编码并返回已编码的字符串

    HtmlDecode

    对HTML编码的字符串进行解码,并返回已解码的字符串

    MapPath

    返回与Web服务器上的指定虚拟路径相对应的物理文件路径

    UrlEncode

    对URL字符串进行编码,以便通过URL从Web服务器到客户端进行可靠的 HTTP 传输

    UrlDecode

    对已被编码的URL字符串进行解码,并返回已解码的字符串

    UrlPathEncode

    对URL字符串的路径部分进行URL编码,并返回已编码的字符串

     示例3:HtmlEncode,HtmlDecode,MapPath

            protected void Page_Load(object sender, EventArgs e)
            {
                Response.Write(Server.MapPath("WebForm1.aspx"));
    
                string str = "<h1>你好</h1>";
                Response.Write(str);
                string strHtmlEncode = Server.HtmlEncode(str);
                Response.Write(strHtmlEncode + "<br>");
                string strHtmlDecode = Server.HtmlDecode(strHtmlEncode);
                Response.Write(strHtmlDecode + "<br>");
    
                Response.Write(Request.PhysicalApplicationPath);
            }

    4.Session对象

          Session对象代表服务器与客户端所建立的会话.

          从一个客户端打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话.

          为什么需要Session?当一个客户访问一个服务器时,可能会在这个服务器的多个页面之间反复跳转,服务器应当通过某种办法来识别这是来自同一个客户的不同请求,这种办法通常就是使用session对象。

         session对象可以实现在一个会话期间的多页面间的数据共享/传递。

         可以使用Session 对象存储用户登录网站时候的信息。当用户在页面之间跳转时,存储在Session对象中的变量不会被清除。

         系统为每个访问者都设立一个独立的Session对象,用以存储Session变量,并且各个访问者的Session对象互不干扰。

         Session与Cookie是紧密相关的。 Session的使用要求用户浏览器必须支持Cookie。

         Session主要属性:

              Count:获取会话状态集合中的项数

              Keys:获取存储在会话中的所有值的键的集合

              Timeout:一个Session对象被创建以后,其生存期,默认的时间为20分钟。也可对其修改,如Session.Timeout=60;

    示例4:

    Session练习1:从初始页面传2个整数到Receive.aspx页面进行相加。

    WebForm1.aspx

    <body>
        <form id="form1" runat="server">
            <div>
                <asp:Button ID="Button1" runat="server" Text="相加" OnClick="Button1_Click" />
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
            </div>
        </form>
    </body>

    WebForm1.aspx.cs

            protected void Button1_Click(object sender, EventArgs e)
            {
                Session["a"] = TextBox1.Text;
                Session["b"] = TextBox2.Text;
                Response.Redirect("Receive.aspx");
            }

     Receive.aspx.cs

            protected void Page_Load(object sender, EventArgs e)
            {
                int a = int.Parse(Session["a"].ToString());
                int b = int.Parse(Session["b"].ToString());
                Response.Write(a + b);
            }

     =>

    session练习2:

    Default.aspx.cs

            protected void Page_Load(object sender, EventArgs e)
            {
                Session["Count"] = 0;
                Session["Name"] = "tom";
                Server.Transfer("WebForm1.aspx");//跳转后不再回来。excute跳转后会回来
            }

    WebForm1.aspx.cs

            protected void Page_Load(object sender, EventArgs e)
            {
                for (int i = 0; i < Session.Count; i++)
                    Response.Write(Session.Keys[i] + " :"  + Session[i].ToString() + "<br>");
            }

    Session练习3:购物车

         见链接:https://blog.csdn.net/qq_40323256/article/details/83934072

    5.Application对象

          Application对象是一个比较重要的对象,对Application对象的理解关键是:网站所有的用户公用一个对象,当网站服务器开启的时候,Application就被创建,在网站运行期间持久保存。利用Application这一特性,可以方便地创建聊天室和网站计数器等常用站点应用程序。

         Application对象没有自己的属性,用户可以根据自己的需要定义属性,来保存一些信息,执行完以后,该对象就被保存在服务器上,执行程序时依然可以输出原先保存的值。

    <%Application["Greeting“]="你好!"%>
    <%=Application["Greeting“]%>
    

         Application提供两个方法:

    (1) Lock()——锁定Application对象,防止被其他用户访问。

    (2) Unlock()——解除锁定,可以接受用户的访问。

        Application提供两个事件:

    (1) Application_Start()——Application开始创建的时候,调用该事件。

    (2) Application_End()——Application被清除的时候,调用该事件。

    例子1

    Default.aspx.cs

            protected void Page_Load(object sender, EventArgs e)
            {
                if (Application["Count"] == null)
                    Application["Count"] = 1;
                else
                {
                    int n = (int)Application["Count"];
                    n++;
                    Application["Count"] = n;
                }
                Response.Write("页面访问量" + Application["Count"]);
            }

    6.ViewState对象-暂不介绍

     

    综合示例:聊天室

         见链接:https://blog.csdn.net/qq_40323256/article/details/83934458

     

     

     

     

    展开全文
  • ASP.NET WebForm中使用 Route

    千次阅读 2017-03-30 23:14:23
    使用ASP.NET MVC的同学可能对Route已经...本文将介绍在ASP.NET WebForm中使用Route。1.找到Global.asax文件,如果没有这个文件就新建一个。2.添加RegisterRoutes方法 Code highlighting produced by Actipro CodeHi

    使用过ASP.NET MVC的同学可能对Route已经有些接触,在ASP.NET WebForm中为实现类似的功能也许会使用URL Rewrite。本文将介绍在ASP.NET WebForm中使用Route。

    1.找到Global.asax文件,如果没有这个文件就新建一个。

    2.添加RegisterRoutes方法

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 public static void RegisterRoutes(RouteCollection routes)
    {
        // 默认页
        routes.MapPageRoute(
            "Defautl",
            "",
            "~/Folder1/WebForm1.aspx"
            );
    
        // 对{folder}/{webform}形式的URL进行路由
        routes.MapPageRoute(
            "WebForm1",
            "{folder}/{webform}",
            "~/{folder}/{webform}.aspx"
            );
    
        // 对{folder}/{page}形式的URL进行路由(带参数)
        routes.MapPageRoute(
            "WebForm2",
            "{floder}/{webform}/{parameter}",
            "~/{floder}/{webform}.aspx"
        );
    
    }

    3.在Application_Start方法中使用RegisterRoute方法。

    protected void Application_Start(object sender, EventArgs e)
    {
         RegisterRoutes(RouteTable.Routes);
     }

    如果要获取URL中的参数,可以参考下面的代码

    string parameter = Page.RouteData.Values["parameter"] as string;

    它将获取占位符为parameter的参数。如~/Folder2/WebForm3/abc可获取parameter参数的值是abc,但是如果遇到~/Folder2/WebForm3?parameter=abc似乎获取不到parameter的参数值。可以使用

    string parameter = Request.Params["parameter"] as string;

    来获取。


    ASP.NET 4的Demo实践:URL路由改进支持

    从.NET框架3.5 SP1开始,微软推出了ASP.NET路由支持,从而实现了特定资源的URL与其对应的Web服务器上的物理文件之间的彻底解耦。借助于ASP.NET路由支持,开发人员可以定义一组路由规则,从而实现把路由模式映射到一个生成相应内容的类。例如,你可以把URL“Categories/CategoryName”映射到一个类,该类接收CategoryName而最终生成对应于此种类的产品信息显示于一个网格中的一组HTML标记。有了这样的映射,用户便可以通过访问www.yoursite.com/Categories/Beverages来查看饮料种类对应的所有产品信息。

      在.NET 3.5 SP1中,ASP.NET路由主要是为ASP.NET MVC应用而设计的,虽然在非ASP.NET MVC框架支持的Web窗体应用程序中也有可能实现ASP.NET路由支持。然而,在Web窗体应用程序中实现ASP.NET路由会涉及大量额外的工作。

      在Web窗体中,通常情况下,我们都要把路由模式映射到一个实际的ASP.NET页面。为此,我们需要创建一个路由处理类以便在请求路由URL时调用之,并且在一定意义上实现了把请求调度到适当的ASP.NET页面。例如,为了把一个路由映射到一个物理文件,比如把Categories/CategoryName映射到ShowProductsByCategory.aspx,我们需要如下三个步骤:

      (1)在Global.asax文件中定义映射,用于把路由模式映射到一个路由处理类;

      (2)创建路由处理类,它负责解析网址,把所有路由参数存储到一些目标页面可以访问到的位置(如HttpContext.Items),并返回一个目标页面或处理请求路由的HTTP处理器的实例;

      (3)在目标页面中编写代码来获取路由参数,并使用他们生成页面内容。

      且不说花费了多大的代价仅仅读取前面的语句(更不用担编写之),你完全能够想象到—在Web窗体应用程序中执行ASP.NET路由不一定是开发人员最直接的任务。

      值得庆幸的是,ASP.NET 4.0通过添加一组类和助理方法极大地简化了ASP.NET路由在Web窗体应用程序中的使用。使用ASP.NET 4.0,你会更容易地定义路由规则,而不再需要创建一个自定义路由处理类。本文将详细探讨这方面的改进支持。

    一、ASP.NET路由技术概述

      ASP.NET路由能够干净地实现URL与网页文件名之间的解耦,从而可用于创建干净、简洁且搜索引擎友好的网址。有关为什么应该在Web应用程序中使用ASP.NET路由的详细讨论,在此不作详细讨论,请参考其他有关文章。

      概括地说,ASP.NET路由允许开发人员定义路由规则,从而实现把一个路由模式(如Categories/CategoryName)映射到一个处理请求的类。这些路由规则在应用程序启动时就已经定义在文件Global.asax中的Application_Start事件处理程序中。

      在Web窗体应用程序中,我们可能已经拥有了产生我们感兴趣内容的ASP.NET网页,我们只需要通过路由规则把路由模式映射到这些ASP.NET页面—通过把任何路由参数(例如CategoryName)映射到该ASP.NET页面来实现。当在ASP.NET 3.5 SP1中使用ASP.NET路由时,没有方法直接把路由模式映射到ASP.NET页。相反,我们必须创建一个路由处理类,它负责传递有关传入请求的信息,并且必须返回一个HTTP处理程序来处理此请求。通常,在Web窗体应用程序中一个路由处理类执行以下步骤:

      (1)根据需要解析网址,或许研究某些路由参数,并以这些值为基础作出决定。

      (2)从需要被传递到ASP.NET页面或HTTP处理程序(它们将处理这一请求)的URL加载任何路由参数。总之,我们要确保ASP.NET页面会生成实际内容,因为此请求知道所有路由参数(如CategoryName)的值。一个传达这样的信息的办法是,把它们放在HttpContext.Items集合中—此集合担当存储特定长度的请求信息的数据存储信息库的作用。

      (3)返回执行上述处理的ASP.NET页面或HTTP处理程序的实例。

      通常,这些路由处理程序类具有差不多相似的特征。你把路由参数存储到HttpContext.Items集合中,然后创建并返回一个负责生成该网址对应内容的ASP.NET页面的实例。尽管路由处理类具有相似特征,但是编写这些类是一项冗长的任务,因为每个新路由都需要一个新的处理程序类,而此类需要实现几乎与前一个类同样的任务。

      在ASP.NET 3.5 SP1中使用ASP.NET路由的另一种挑战主要与负责生成最终内容的ASP.NET页面相关。此页面必须从HttpContext.Items集合((或其它其他存储它们的路由处理程序类)中读出路由参数。此外,为一个超链接或Response.Redirect调用生成路由友好的URL(如Categories/CategoryName)的语法也有点冗长和混乱。

      在ASP.NET 4.0中,路由支持得到了增强,包括一些新的路由相关的方法,从而使定义映射到实际ASP.NET页面的路由规则更加简单。在ASP.NET 4.0中,你不再需要创建自定义路由处理程序类作为中介,而只需要从Global.asax文件中的路由规则中直接引用ASP.NET页面即可。当从路由规则中指定一个ASP.NET页面时,路由参数被自动存储在一个新的RouteData集合中,此集合可以从ASP.NET页面中通过Page.RouteData结构进行访问。更重要的是,在.NET框架4.0中包括一个自定义参数控件,这样一来,你可以使用声明的方式从ASP.NET的数据源控件(如SqlDataSource和LinqDataSource等)中使用RouteData中的值,而且也提供了一些方法来生成路由友好的URL,以及重定向到路由友好的网址。

      本文将重点讨论ASP.NET在ASP.NET 4.0中的路由系统改进支持。本文提供的演示程序是一个Web窗体应用程序,这是一个罗斯文商贸网站的前端。它使用了ASP.NET路由支持来创造简洁且搜索引擎友好的网址。例如,/Categories/All将显示所有类别,/Categories/Beverages将列出属于饮料类的所有产品,而/Products/Chai将显示有关产品Chai的细节信息。

      请注意,为了在ASP.NET 3.5 SP1中使用ASP.NET路由支持,你需要明确地在你的项目中添加对System.Web.Routing程序集的引用,并需要添加一些标记到Web.config配置文件中。这些步骤在使用ASP.NET 4.0时不再需要,而且,在Global.asax文件中用于定义路由规则的语法更为短小、简单和具有可读性。

      本文后面的内容将给出在ASP.NET 4.0中使用ASP.NET路由的详细步骤描述。

    二、使用ASP.NET 4.0路由

      下面给出在ASP.NET 4.0中使用ASP.NET路由的详细描述。

      0. 前提

      本文提供的演示程序使用了新添加到ASP.NET 4.0中的ASP.NET路由功能。如果你使用Visual Studio 2010或Visual Web Developer 2010(或更高版本),那么你正好具备了这一前提。

      1.在文件Global.asax中定义路由规则

      要使用ASP.NET路由系统,你需要在应用程序启动时定义一个或多个路由。方法是,在你的项目中添加一个全局应用程序类文件(Global.asax)。在这个文件中,我们将在Application_Start事件中注册这些路由。

      定义于Global.asax文件中的路由指示什么样的路由处理程序负责处理什么样的URL模式。在MVC应用程序中,一种流行的模式是Controller/Action/ID;这意味着针对/Products/View/Aniseed Syrup或Categories/Edit/Beverages的请求将由配置的路由处理程序来处理。在应用程序中定义什么样的路由方面,你可以拥有足够的灵活性。例如,你可以定义模式的多个部分,定义缺少部分的默认值,甚至还要定义针对某些输入类型的限制部分。

      本文演示程序是一个简单的数据驱动应用程序,它使用了Northwind数据库,并接受下列模式的URL:

      /Categories/All—列出数据库中所有产品类型;

      /Categories/CategoryName—列出相应于特定类型的产品信息;

       /Products/ProductName—显示特定产品的信息。

      因此,我在Global.asax文件的Application_Start事件处理程序中定义了三个路由,如以下代码所示。(注:RouteTable对象和RouteCollection类位于System.Web.Routing命名空间。)

        在Application_Start方法中,我们调用了RegisterRoutes,并传递进RouteCollection类型的参数RouteTable.Routes。接下来,在RegisterRoutes方法中,调用RouteCollection类的MapPageRoute方法,它定义了一个路由模式到ASP.NET页面的路由映射。例如,在第一次调用MapPageRoute方法时,我们创建了一个命名为“All Categories”的路由模式—它负责把路由模式Categories/All映射到ASP.NET页面~/ AllCategories.aspx。

      接下来的两个MapPageRoute方法调用使用参数创建路由模式。其中,“View Product”路由把模式Products/{ProductName}映射到ASP.NET页面~/ ViewProduct.aspx。这里,{ProductName}是一个参数,意味着任何Products/ProductName形式的请求都将被路由到~/ViewProduct.aspx页面。不久你就会看到,{ProductName}参数的值可以从页面~/ViewProduct.aspx中通过Page.RouteData参数加以访问。

      2.创建处理请求的ASP.NET页面

      使用ASP.NET 4.0,你不再需要创建一个自定义的路由处理程序类。当你使用MapPageRoute方法时,这一切都会由底层库为你自动完成。剩下的仅仅是,建立处理请求的ASP.NET页面(AllCategories.aspx,CategoryProducts.aspx和ViewProduct.aspx)。当然,本文示例中的这三个网页相当简单—它们都使用数据源控件,并以编程方式绑定到通过路由参数获取的Categories或者Products表格的数据库结果。

    void Application_Start(object sender, EventArgs e)
    
      {
    
      RegisterRoutes(RouteTable.Routes);
    
      }
    
      void RegisterRoutes(RouteCollection routes)
    
      {
    
      // Register a route for Categories/All
    
      routes.MapPageRoute(
    
      "All Categories", //路由名
    
      "Categories/All", //路由URL
    
      "~/AllCategories.aspx" //处理路由的网页
    
      );
    
      //处理Categories/{CategoryName}的路由
    
      //更多信息,请参考http://forums.asp.net/p/1417546/3131024.aspx
    
      routes.MapPageRoute(
    
      "View Category", //路由名
    
      "Categories/{*CategoryName}", //路由URL
    
      "~/CategoryProducts.aspx" //处理路由的网页
    
      );
    
      // Register a route for Products/{ProductName}
    
      routes.MapPageRoute(
    
      "View Product", //路由名
    
      "Products/{ProductName}", //路由URL
    
      "~/ViewProduct.aspx" //处理路由的网页
    
      );
    
      }
    

      本文演示程序使用LINQ-to-SQL工具实现数据访问。你会在App_Code文件夹下发现一个Northwind.dbml文件,它创建了一个NorthwindDataContext类。ViewProduct.aspx页面中包含一个DetailsView控件,其中的字段用于显示产品的名称,供应商,单位数量,价格以及其他相关信息。页面的代码隐藏类具有以下(省略了部分)代码:

    protected void Page_Load(object sender, EventArgs e)
    
      {
    
      dvProductInfo.DataSource = new Product[] { Product };
    
      dvProductInfo.DataBind();
    
      }
    
      private Product _Product = null;
    
      protected Product Product
    
      {
    
      get
    
      {
    
      if (_Product == null)
    
      {
    
      string productName = Page.RouteData.Values["ProductName"] as string;
    
      NorthwindDataContext DataContext = new NorthwindDataContext();
    
      _Product = DataContext.Products.Where(p => p.ProductName == productName).SingleOrDefault();
    
      }
    
      return _Product;
    
      }
    
      }
    

     在上面的Page_Load事件处理程序中,DetailsView控件被绑定到Product属性返回的Product对象上。在此,Product属性读取Page.RouteData集合中的URL中的ProductName参数值,使用的语法是:Page.RouteData.Values[“ProductName”]。然后,在LINQ查询中使用ProductName参数值来取回有关具体产品的信息。

      下面的屏幕截图显示了运行中的ViewProduct.aspx页面。该网页对应的网址是/Products/Chai,有关该Chai的详细信息显示于此页面中。
    这里写图片描述

    在ASP.NET 4.0中设置ASP.NET路由的过程就是这样!但是,在ASP.NET 3.5 SP1中实现上述过程需要五个步骤,而不是二个步骤。

    三、生成路由友好的URL

      在创建超链接或者把用户通过Response.Redirect方法从一个网页导航到另一个页面时,使用定义于Global.asax中的路由模式(而不是使用它的实际名称来引用ASP.NET页面模式)是比较理想的选择。例如,有一个ViewProducts.aspx页面,其中有一个链接—通过此链接可以返回到显示选定产品类别的所有产品信息,而这个产品类别链接到Categories/CategoryName,其中CategoryName是产品类别名,要显示的是此类别产品的信息。此时,你可以使用Page.GetRouteUrl方法生成这些路由友好的URL。这个方法有许多重载版本,但最简单的版本仅接收两个参数:路由名称和参数的值。

      例如,为了取得返回到Categories/CategoryName页面的正确的URL,可以使用以下语法:
    Page.GetRouteUrl(“View Category”, new { CategoryName = CategoryName });

      在这里,“View Category”是定义于文件Global.asax中路由规则的名称,而CategoryName是出现在URL中的CategoryName参数的值。另一个更具体的例子是:
    Page.GetRouteUrl(“View Category”, new { CategoryName = “Beverages” });

    另外,Response.Redirect方法还有另一个新的版本,名为Response.RedirectToRoute。像Page.GetRouteUrl方法一样,这个方法能够接收路由名称和参数值,然后将用户重定向到适当的、路由友好的网址。下面的示例演示了如何将用户重定向到一个特定产品的视图:
     Response.RedirectToRoute(“View Product”, new { ProductName = ProductName });

    四、结论

      ASP.NET路由是.NET框架提供的一个功能强大的库,通过它可以实现URL与底层物理文件间的彻底解耦。自从ASP.NET 3.5 SP1引入后,ASP.NET路由被初步应用于开发ASP.NET MVC应用程序。虽然它也可以用于Web窗体应用程序中,但是配置它需要繁琐的步骤,而且看上去会造成不必要和重复的代码。

      ASP.NET 4.0中加强了ASP.NET路由库,并针对Web窗体应用程序提供了更加灵活的直观的使用场景支持。正如本文中你所看到的,把一个路由模式映射到ASP.NET页面只需要在Global.asax中添加几行代码,而不再需要创建一个自定义的路由处理类。在底层,ASP.NET路由库会自动把路由参数保存到RouteData集合中—然后,你可以从Page类中访问它。而且,这些RouteData值也可以通过像SqlDataSource和ObjectDataSource这样的数据源控件以声明进行访问。

    展开全文
  • 本文是关于为ASP.NET Core创建动态菜单系统。 开发新的Web应用程序时,我们想要添加一个基于当前路由和参数动态生成的菜单组件。 我最初研究了ASP.NET Corepartials的概念,虽然这些对于重用静态标记非常有用...

    本文是关于为ASP.NET Core创建动态菜单系统。

    在开发新的Web应用程序时,我们想要添加一个基于当前路由和参数动态生成的菜单组件。

    我最初研究了ASP.NET Corepartials的概念,虽然这些对于重用静态标记非常有用,但它们对于构建动态菜单等动态的数据驱动内容并不是那么好。

    如果您的需求是重用动态和/或数据驱动的内容,那么正确的设计方法是使用ViewComponent。来自Microsoft文档

    在查看Partial ViewsView Components之后,我发现ViewComponents不必依赖已存在的数据。例如,您可以简单地对服务器端方法进行异步调用,如下所示:

    @await Component.InvokeAsync("MenuItems", 1234)

    根据Microsoft文档,视图组件与部分视图类似,但是视图组件更加强大。视图组件不一定使用模型绑定,仅取决于调用时提供的数据。视图组件:

    • 呈现一个块而不是整个响应。
    • 包括在控制器和视图之间发现的相同的关注点和可测试性优势。
    • 可以有参数和业务逻辑。
    • 通常从布局页面调用。

    视图组件适用于任何具有可重用渲染逻辑的位置,这些逻辑对于局部视图来说过于复杂,例如:

    • 动态导航菜单
    • 标签云(它在哪里查询数据库)
    • 登录面板

    所以现在,我们的菜单树结构由ViewComponent处理。构建用户指定菜单的所有业务逻辑都包含在ViewComponent中,ViewComponent返回菜单树结构。然后由调用ViewComponentRazor页面显示。当你调用视图组件方法时,不必传递参数,也不必传递视图模型。但是,对于Partials,您需要在要渲染部分视图的时传递数据(视图模型),因此您需要事先准备好数据,使其与现有视图紧密耦合。

    还有许多其他好处,例如:

    • 在单独的组件中封装Razor Page的基础业务逻辑
    • 允许对业务逻辑进行单元测试
    • 允许UI组件在不同的表单中重用,基本上像独立视图一样
    • 通过分离关注点导致更清晰的代码

    这是View Component本身:

    namespace WebApplication1.Controllers
    {
        public class MenuViewComponent : ViewComponent
        {
            private readonly MenuHelper _cbaMenuHelper = new MenuHelper();
         
            public async Task<IViewComponentResult> InvokeAsync(int testId)
            {
                //testId is optional, and can be passed in when you call InvokeAsync
                //Parse current URL to determine which menu item to highlight:
                string baseUrl = Request.Scheme + "://" + Request.Host.Value;
                var httpRequestFeature = Request.HttpContext.Features.Get<IHttpRequestFeature>();
                var uri = httpRequestFeature.RawTarget;
                var id = HttpContext.Request.Query["id"].ToString();  //Parse Query String
                var menuItems = await _cbaMenuHelper.GetAllMenuItems(baseUrl + uri, id); //Can pass in testId here if required.
                return View("_MenuPartial", _cbaMenuHelper.GetMenu(menuItems, null));
            }
    
        }
    }

    ViewComponent调用其他方法来实际生成菜单。在这种情况下,它只是一个Parent - >child映射菜单对象列表,以下代码在此供您参考:

     

    public class Menu
        {
            public Guid ID { get; set; }
            public Guid? ParentID { get; set; }
            public string Content { get; set; }
            public string IconClass { get; set; }
            public string Url { get; set; }
            public string SelectedStyle { get; set; }  // If you want a style vs a class;
            public string SelectedClass { get; set; }
            public string OnClick { get; set; }
            public long Order { get; set; }
        }

    一旦你获得菜单项的分层列表后,只需将其返回到InvokeAsync()方法内显示的视图中即可。在这种情况下,视图只是根据菜单记录中的父子关系递归显示菜单项:

    @foreach (var menu in Model)
    {
        if (menu.Children.Any())
        {
            <li>
                <a href="#" class="tree-menu-header">
                    <i class="@menu.IconClass"></i><span>@menu.Content</span>
                </a>
                <ul class="menu vertical nested is-active">
                    <partial name="Components/Menu/_MenuPartial" model="menu.Children" />
                </ul>
            </li>
        }
        else
        {
            <li class="@menu.SelectedClass">
                @{
                    if (string.IsNullOrEmpty(menu.Url))   //Add either onclick event or href.
                    {
                        <a onclick="@menu.OnClick">
                            <i class="@menu.IconClass"></i><span style="@menu.SelectedStyle">@menu.Content</span>
                        </a>
                    }
                    else
                    {
                        <a href="@menu.Url">
                            <i class="@menu.IconClass"></i><span style="@menu.SelectedStyle;">@menu.Content</span>
                        </a>
                    }
                }
            </li>
        }
    }

    这将返回包装在一个实例中IViewComponentResult,该实例是从ViewComponent返回的受支持的结果类型之一

    这是从布局页面调用ViewComponent的调用,如下所示:

    @await Component.InvokeAsync("Menu", new { cbaId = ViewBag.Id })

    在这种情况下我使用了ViewBagID传递给ViewComponent,因此有一些显示内容的上下文。您还可以在ViewComponent中查看我检索当前Route,并使用它以及上面的Id来确定要加载的菜单项。

    最终结果如下:

    https://www.codeproject.com/KB/aspnet/1271364/599acbae-a11c-49d2-95e9-2828c257ce1b.Png

    您可以看到排序是正确的,并且使用了Font Awesome图标,一个漂亮的可折叠菜单就这样创建了。单击新建按钮可以运行自定义Javascript,最有可能创建一些内容:

    https://www.codeproject.com/KB/aspnet/1271364/5fded3b3-8a51-4b30-8e65-40a739c0449f.Png

    其余的项是路径Url,都是从MenuHelper类创建的。我使用基本的ASP.NET Core应用程序作为起点并围绕它包装我的菜单组件。

    文章中的源代码可在以下地址中找到:https://github.com/IntrinsicInnovation/CoreMenuBuilder

    我很快就创建了整个动态菜单系统。并且,它基本上独立于系统中的其他视图和部分视图。只需将我的所有代码剪切并粘贴到您的应用程序中,即可重复使用。这是一个现实世界的例子,解决了现代应用程序开发的非常现实的问题。拥有这样的独立易于测试的模块可确保您的应用程序不太可能在生产环境中引发问题。

     

    原文地址:https://www.codeproject.com/Articles/1271364/Creating-a-Side-Menu-for-ASP-NET-Core-using-a-View

    展开全文
  • ASP.Net 4.0 --- 基本对象(二)

    千次阅读 热门讨论 2017-08-12 10:58:13
    ASP.Net 基本对象Asp.Net是一个庞大的软件体系,它提供了大量的对象类库,这些类库包含了许多封装好的内置对象,开发人员可以直接使用这些对象的方法和属性,只需较少的代码量就可以完成很多的功能。
  • Creating a More Complex Data Model for an ASP.NET MVC Application (4 of 10) By Tom Dykstra|July 30, 2013 The Contoso University sample web application demonstrates how to cre
  • 这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类。这篇教程假设你事先对Microsoft Entity Framework没有任何的了解。读完本篇教程,你将会理解如何使用...
  • .Net 的反射(动态创建类型实例)

    千次阅读 2017-02-07 11:29:08
    动态创建对象 前面节,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它。可以说,前面三节,我们学习的都是反射是什么,接下来的章节,我们将学习反射...
  • ASP.NET内置对象详解

    千次阅读 2011-12-06 13:40:03
    (1)简述ASP.NET内置对象。  答:ASP.NET提供了内置对象有Page、Request、Response、Application、Session、Server、Mail和Cookies。这些对象使用户更容易收集通过浏览器请求发送的信息、响应浏览器以及存储...
  • ASP.Net 内置对象

    千次阅读 2020-06-01 10:23:40
    Response对象 Response对象主要用于将数据从服务器发送回浏览器。 2、Response对象的常用属性及说明 属性 说明 Buffer 获取或设置一个值,该值指示是否缓冲输出,并完成处理...
  • 如何IIS6,7部署ASP.NET网站

    千次阅读 2018-07-13 13:25:55
    我的第一篇博客,我发布过一个示例项目,主要演示了我的我的AJAX框架和我的通用数据访问层。虽然当初我认为我已考虑地比较周全了,而且还提供了足够的说明文档,但发布后的将近一年的时间里,还是有不少
  • ASP.NET的内置对象:Session对象

    千次阅读 2014-07-20 16:08:42
    Session对象用于存储多个页面调用之间特定用户的信息。Session对象只针对单一网站使用者,不同的客户端无法相互访问。Session对象中止于联机机器离线时,也就是当网站使用者关掉浏览器或超过设定Session对象的有效...
  • 在ASP.NET面向对象的编程思想

    千次阅读 2014-04-13 22:28:27
    在ASP.NET面向对象的编程思想
  • Asp.Net】五大对象

    千次阅读 热门讨论 2016-06-07 09:42:48
    没有学习Asp.Net之前就已经知道了Application这个东东,但是当时不是很了解,也不知道到底是什么,学习了Asp.Net才知道它是其中的一个对象。 Application:全局应用程序类。服务器内存存储数量
  • 前言传统的web应用程序,客户端(浏览器)通过请求页面来启动与服务器的通信。然后服务器处理该请求,并发送HTML页面到客户端。随后页面上的操作——例如,用户导航到一个链接或提交一个包含数据的表单——...
  • Scripting.FileSystemObject 为 IIS 内置组件,用于操作磁盘、文件夹或文本文件,通常简写为FSO,在ASP时代,对它的调用操控较多,其实易语言通过对象这个类也可以完全实现,由于是微软的东西,我们删除文件,创建时...
  • MVC架构在Asp.net的应用和实现

    千次阅读 2017-07-13 17:21:35
    【转载】MVC架构在Asp.net的应用和实现   摘要:本文主要论述了MVC架构的原理、优缺点以及MVC所能为Web应用带来的好处。并以“成都市信息化资产管理系统”框架设计为例,详细介绍其在Asp.net环境下的具体...
  • 在ASP.NET面向对象的编程思想首先,我们还是来谈一下面向对象的编程思想吧。我想现在的主流编程思想无非两种:结构与面向对象。以前,在ASP中我们完全采用的是结构化思想。现在,asp.net可以完全支持面向对象的...
  • 下面 Web 空应用里展示一个简单的例子来实现发送文本消息。 本文目录: 创建 Web 空应用 命令行方式创建 添加SDK引用 ...添加Controller,Get方法发送消息 创建 Web 空应用 命令行方式创建 $ ...
  • ASP.NET页面对象 - Request

    千次阅读 2009-11-11 16:12:00
    一、HttpRequest 类使 ASP.NET 能够读取客户端 Web 请求期间发送的 HTTP 值。 下面的代码示例使用 StreamWriter 类将若干 HttpRequest 类属性值的值写入文件。对于是字符串类型的属性,属性值被写入文件时将被...
  • .NET动态创建对象的小结

    千次阅读 2012-03-16 10:35:25
    .NET动态创建对象的小结 我们新建一个Console控制台项目。然后,添加一个示范类,本文中将通过对这个示范类的操作来进行说明: public class Calculator { private int x; private int y; public ...
  • pygameSurface对象的方法详解

    千次阅读 2020-05-18 11:54:07
    该方法仅适用于 Pygame 的单元测试,不大适合正式的应用程序中使用。 该函数会根据需求临时锁定和解锁 Surface 对象。 Pygame 1.9.2 新增加的。 get_palette() 功能:获取 Surface 对象 8 位索引的调色板。 属性...
  • 使用asp.net创建用户界面[转]

    千次阅读 2005-05-22 11:57:00
    1. Web命名空间 ü System.WebApplication、Browser、Cache、Cookies、Exception、Request、Response、Server和Trace对象。ü System.Web.SessionStateSession对象。ü System.Web.ServicesWebSe
  • Mvc文件上传器 ... 通常在任何 ASP.NET mvc 应用程序中创建或更新实体对象时,通常需要上传大量文件并将它们与该实体相关联。 我们可能还想为正在上传的文件保存一些条目。 为了实现这一点,我们通常
  • ASP.NET MVC 程序使用Entity Framework读取关联数据 By Tom Dykstra|July 30, 2013 Translated by litdwg ...Contoso University示例网站演示如何使用Entity Framework 5创建ASP.NET MVC 4应用程序。Entity Fr
  • ASP.NET 的session对象

    千次阅读 热门讨论 2013-11-13 11:29:36
    ASP.NET一共内建了7个对象,有session 、Application、response 、request 、server 等。  这里就介绍其中的session对象。Session即会话,他是指一个用户一段时间内对某一个站点的一次访问。它表示一个客户端用户...
  •  在上一章,我们创建了MovieDBContext类来连接数据库、处理Movie 对象和数据库记录的映射。但是我们没有指定使用什么数据库,也没指定使用哪个数据库。其实,我们没有指定数据库的时候,Entity Framework ...
  • 使用ASP.NET MVC框架创建电子商务网站

    千次阅读 2010-07-24 11:17:00
    此篇通过创建一个电子商务网站,讨论ASP.NET MVC框架下控制器是如何与视图做交互的。   这个系列的第一篇建造了一个简单的电子商务产品列表/浏览网站。它讨论了MVC后面的高层次的概念,示范了如何从头...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,721
精华内容 26,688
关键字:

在asp中创建对象通常用