ASP.NET MVC 5 (四) C#基本语言特性

驾驭ASP.NET MVC:C# Web开发的精粹 ASP.NET MVC是微软提供的一个用于构建动态网站的服务器端框架,它遵循模型-视图-控制器(MVC)设计模式,以实现代码的高内聚低耦合。本文将深入探讨如何在C#中使用ASP.NET MVC框架进行Web应用程序开发,包括项目结构、路由、控制器、视图和模型的创建,并通过实际代码示例展示其开发流程。ASP.NET MVC框架的核心理念及它如何帮助开发者构建可维护、可测试的Web应用程序。展示如何在MVC框架中创建模型类,以及如何使用数据注解来验证数据。set;set; 阅读详情

介绍C#语言的基本特性。

创建示例代码

使用ASP,.NET MVC Web 应用程序,如第一章说的,创建一个空的程序,命名为LanguageFeatures,创建完成后在控制器文件夹Controllers中添加一个控制器HomeController.cs,打开编辑修改为如下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LanguageFeatures.Models; //此时该命名空间不会被解析,只要在Models文件夹中添加一个类文件之后就会解析了
namespace LanguageFeatures.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public string Index()
        {
            return "Navigate to a URL to show an example";
        }
    }
}

在Index方法中右键单击添加视图,添加一个命名为Result.cshtml的视图文件,修改为一下内容:

@model string
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Result</title>
</head>
<body>
    <div> 
        @Model
    </div>
</body>
</html>

这是一个强类型视图,模型类型为String。

添加System.Net.Http程序集

后面的一些内容依赖于该程序集,所以需要添加。添加方法是在解决方案资源管理器中右键单击References选择Add References添加程序集,找到System.Net.Http程序集点击确定即可。

添加模型类Product.cs

在Models文件及右键单击Add->class,添加名称为Product.cs的模型类,打开并且修改为如下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LanguageFeatures.Models
{
    public class Product
    {
        public string Name{get;set;}       
    }
}

在HomeController中添加对Product的使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LanguageFeatures.Models; /*此时该命名空间不会被解析,只要在Models文件夹中添加一个类文件之后就会解析了*/
namespace LanguageFeatures.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public string Index()
        {
            return "Navigate to a URL to show an example";
        }

   public ViewResult AutoProperty()
        {
    //创建对象
            Product myProduct = new Product();
    //设置属性值
            myProduct.Name = "kayak";
    //读取属性值
            string productName = myProduct.Name;
    //生成视图,使用View(stirng,object)方法的重载
            return View("Result",(object)String.Format("Product name:{0}",productName));
        }

    }
}

运行结果:运行程序后访问/Home/AutoProperty 会得到结果:
Product name :kayak

使用扩展方法

扩展方法是指对那些不是我拥有的、不能直接修改的类添加方法的一种方式,如在Models文件夹中添加一个ShoppingCart.cs模型类,并修改为如下内容,它表示一个Products对象集合:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LanguageFeatures.Models
{
    public class ShoppingCart:IEnumerable<Product>
    {
        public List<Product> Products { get; set; }
    }
}

在Models文件夹中添加一个MyExtentionMethods.cs模型类文件并修改为如下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace LanguageFeatures.Models
{
    public static class MyExtentionMethods
    {
        //对类ShoppingCart添加拓展方法
       public static decimal TotalPrices(this ShoppingCart cardParam)
        {
     decimal total = 0;
      foreach(Product prod in cardParam.Products)
      {
              total += prod.Price;
       }
        return total;
    }
   }
}

第一个this关键字把TotalPrices方法标记为ShoppingCart类的一个扩展方法,只要这个类在你的命名空间或using命名空间中即可。可以通过参数cardParam来引用ShoppingCart类的实例。这个扩展方法实现了把ShoppingCart类中Product集合的所有元素价格累计算出并返回。这样对类ShoppingCart就可以像引用它本身定义的方法一样来使用TotalPrices方法,比如在HomeController中添加如下方法:

 public ViewResult UseExtension()
    {
        ShoppingCart cart = new ShoppingCart
        {
            Products = new List<Product>{
                new Product{Name="kayak",Price=275M},
                new Product{Name="LifeJack",Price=48.95M},
                new Product{Name="Soccer",Price=19.58M},
                new Product{Name="Corner",Price=34.95M}
            }
        };
//如这行代码,TotalPrices方法像ShoppingCart类中定义的方法一样被调用
        decimal cartTotal = cart.TotalPrices();

        return View("Result", (object)String.Format("Total:{0:c}", cartTotal));
    }

运行程序并导航到/Home/UseExtension 会得到如下结果:
Total:¥378.48 或者Total:$378.48

自定义类或系统预定义的类都可以定义扩展方法,对接口同样可以运用扩展方法,即对实现的接口类像普通的类一样添加扩展方法即可。
创建过滤扩展方法。
对对象集合进行过滤的扩展方法,即定义一个扩展方法,在方法体中按照给定的参数和规则进行筛选,使用yield关键字返回符合筛选条件的对象集合,不符合条件的被丢弃。这是对IEnumerable进行操作并返回IEnumerable子集的扩展方法,添加之后任何实现该IEnumerable接口的类都可以调用该扩展方法,如Array数组等。
如下,在MyExtentionMethods类中添加扩展方法:

  public static IEnumerable<Product> FileterByCategory(this IEnumerable<Product> productEnum,string categoryParam)
        {
            foreach (Product prod in productEnum)
                if (prod.Category == categoryParam)
                {
                    yield return prod;
                }
        }

在Home控制器中添加动作方法:

  public ViewResult UseFilterExtensionMethod()
        {
            IEnumerable<Product> products = new ShoppingCart
            {
                Products = new List<Product>{
                    new Product{Name="kayak",Price=275M},
                    new Product{Name="LifeJack",Price=48.95M},
                    new Product{Name="Soccer",Category="Soccer",Price=19.58M},
                    new Product{Name="Corner",Category="Soccer",Price=34.95M}
                }
            };
            Product[] productsArray ={
                    new Product{Name="kayak",Price=275M},
                    new Product{Name="LifeJack",Price=48.95M},
                    new Product{Name="Soccer",Category="Soccer",Price=19.58M},
                    new Product{Name="Corner",Category="Soccer",Price=34.95M}
            };
            decimal total = 0, total1 = 0;
    // IEnumerable<Product>对象调用IEnumerable<Product>接口的筛选扩展方法
            foreach (Product prod in products.FileterByCategory("Soccer"))
            {
                total += prod.Price;
            }
    //Array对象调用IEnumerable<Product>接口的筛选扩展方法
            foreach (Product prod in productsArray.FileterByCategory("Soccer"))
                total1 += prod.Price;
            return View("Result", (object)String.Format("Total:{0},Array Total :{1}", total, total1));
        }

运行程序并导航到/Home/UseFilterExtensionMethod 会得到结果:
Total:54.53,Array Total :54.53
这说明对 IEnumerable或Array数组都可以调用筛选扩展方法FileterByCategory。

C-Sharp的字段与属性和对象与集合的初始化器

在C#的一个类中:

public class Text
{
    private string name;
    public string Name{
                    get{return name;}
                    set{name=value;}
                }
}

其get代码块(称为“getter(读取块)”)在读取该属性值时执行,set代码块(称为”setter(设置块)“)在对该属性值赋值时执行,特殊变量value表示要赋的值,属性是由其他类来使用的,比如向这个类传递一些值,就好像他是一个公有字段一样。但字段一般是私有的不可以被直接访问的。
属性名一般大写字母开头,而参数名和字段名消息字母开头。
属性是带有geeter块和setter块的成员。属性值的读取和设置就像对一个常规字段进行设置一样,使用属性要比字段更好,因为可以修改get和set语句而不需要修改依赖这个属性的类。
但当一个类有多个属性时,所有属性都要对字段协调访问,导致类文件冗长,此时可以使用自动实现的属性,可以采用字段支持模式属性而不需要定义这个字段或在getter和setter中指定代码,如下:

public class Product
    {
        public string Name{get;set;}
        public int ProductID{get;set;}
        public string Description { get; set; }
        public decimal Price { get; set; }
        public string Category { get; set; }
    }

当如果需要改变一个属性的实现方式,还可以返回属性规则的格式,但要保证同时实现getter和setter。
当需要使用一个类的实例时,除了要定义时更烦人的是需要多这个实例对象的各个属性进行赋值,如:

Product myProduct = new Product();
            myProduct.Name = "kayak";
            myProduct.Category = "Soccer";
            myProduct.Description = "description";
    …

幸运的是可以使用对象初始化器特性,在一步中创建并填写Product实例:

Product myProduct = new Product{
            myProduct.Name = "kayak",
            myProduct.Category = "Soccer",
            myProduct.Description = "description"};

调用的“{}”形成了初始化器,目的是为参数提供值,以此作为该对象的构造过程,同样可以对集合和数组采用初始化器进行内容的初始化:

string [] arrays={"apple","orrange","plum"};
List<int> intlist =new List<int>{10,20,30,40};
Dictionary<string,int> myDict=new Dictionary<string,int>{
    {"apple",10},{"orange",20},{"plum",30}
}
ASP.NET MVC 5高级编程全面指南 本文还有配套的精品资源,点击获取 简介:本书详细介绍了ASP.NET MVC 5这一强大的开源Web开发框架,基于MVC设计模式,用C#语言和.NET Framework开发高效、可维护的Web应用。内容覆盖MVC基础、C#高级特性、路由、模型绑定、视图、控制器、身份验证、AJAX、测试、部署等多个方面,包含813页的全面指南,适合有一定基础的开发者学习提升,并通过书签功能... 阅读详情

相关推荐

ASP.NET MVC5 Web应用开发实战指南

ASP.NET MVC5 是微软在Web开发领域推动现代化、可测试性和松耦合架构的重要成果,基于MVC设计模式构建,摒弃了传统Web Forms的事件驱动模型。其核心理念是实现关注点分离(Separation of Concerns),通过控制器(Controller)调度请求、模型(Model)封装业务逻辑、视图(View)负责呈现,提升代码组织性与可维护性。MVC5深度集成Razor视图引擎、路由系统和依赖注入机制,支持无状态、RESTful风格的Web应用开发,为高性能、易扩展的企业级项目奠定基础。

weixin_35706255的博客 825

一文讲懂C#、ASP.NET、ASP.NET MVC、ASP.NET web form、asp.net core mvc的区别

一文讲懂C#、ASP.NET、ASP.NET MVC、ASP.NET web form、asp.net core mvc的区别

Blue 4511

全面掌握ASP.NET MVC 5框架与实践技巧

ASP.NET MVC 5是微软开发的用于构建动态网站的Web应用程序框架。它结合了ASP.NET Web Forms和Web API的优势,为开发者提供了一种构建具有良好架构的Web应用程序的手段。ASP.NET MVC 5基于MVC(模型-视图-控制器)模式,允许开发者将应用程序的逻辑、数据和界面分离,从而提高代码的可维护性和可扩展性。MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的输入、处理和输出分开。

weixin_31419153的博客 823

【MVC】C# MVC基础知识点、原理以及容器和管道

国庆假期马上结束,闲暇时间,重温一遍C#关于MVC的技术,控制器、视图、模型,知识点和原理,小伙伴们还记得吗

小5聊的博客 5044

ASP.NET MVC5 新特性

ASP.NET MVC5的新特性,功能很强大,比MVC4有很大的改进。

ASP.NET MVC5 新特性:Attribute路由使用详解

此文档详细讲解了:ASP.NET MVC5 新特性:Attribute路由的使用,非常的详细,值得学习。

asp.net mvc 原理和特性

运行asp.net mvc程序后,就能通过相应的地址访问不同的也面,asp.net mvc 应用程序中,应用程序中页面的url并不是 服务器中实际存在的页面或者目录,而是访问了相应的方 法,asp.net mvc 应用程序通过 global.ascx 和controller实现 url 映射 。 asp.net mvc 工作原理:           当用户访问 http://lo

dingxingmei的专栏 1134

MT5交易软件系统源码

Manager配置的功能及权限:管理客户、开户,销户、入金、信用额度、修改定单、人工交易报表、设定点差、强制平仓、修改密码,设定持仓交割单或挂单小止盈止损点数;26、修改价格 27、更改K线图历史价格 28、同步历史数据;2、系统设置 3、交易管理 4、交易柜台 5、价格更改 6、多台服。务器联机 7、恢复交易历史 8、数据源调整 9、备份服务调整 10、交易市场设定 11、交易单更改 12、平台时间设定(全世界) 13、可添加商品;15、设置商品利息;独立主机(服务器、VPS、VM)

tutujunjun的博客 904

MVC(4)——学习mvc的基础_C#语言的语言特性

经过前三节的了解,我们大概了解了mvc。当时在深入了解前,我们想我们应该先了解C#语言的特性,因为它能帮助我们在后期进步的更快。今天大概分析一下如下八个特性。 一、简化C#属性——使用自动实现的属性 二、一次性创建对象并设置其属性——使用对象或集合初始化器 三、对不能修改的类添加功能——使用扩展方法 四、简化委托的使用——使用lambda表达式 五、隐含类型——使用var关键字 六、不定义类...

程金鹏(程利鹏) 1588

WINDOWS下SIP拨号的实现

在WIN10上拨打SIP电话  由于我的交换原理实验有一个是关于SIP的抓包的。而之前从未接触过SIP,所以在如何完成一次SIP拨号上遇到了不少问题,查了好多资料都没有完整的或者写的很清楚的,这里就对那些资料做一个总结,给出一个比较完善的解决方案,一来是记录此次实验的收获,而来也可能为其他有同样困惑的人解惑。  废话不多说直接开始。首先是下载一个可以拨打SIP电话的客户终端,这里我选择的是MicroSIP, 下载红圈内的文件,下载好之后直接一路安装即可,没有什么特别注意的地方。  安装好客户端之后,就需要注

weixin_43918519的博客 3806

【Arc GIS 零基础教学】土地利用类型图的绘制方法

​Hi,我是胡学长!今天教大家怎么利用Arc GIS 绘制土地利用类型图。土地利用类型图是表达土地资源的利用现状、地域差异和分类的专题地图。它是研究土地利用的重要工具和基础资料,同时也是土地利用调查研究的主要成果之一。在编制土地利用图的基础上,对当前利用的合理程度和存在的问题、进一步利用的潜力、合理利用的方向和途径,进行综合分析和评价。因此,土地利用图是调整土地利用结构,因地制宜进行农业、工矿业和交通布局、城镇建设、区域规划、国土整治、农业区划等的一项重要科学依据。......

一起来交流学习吧 1万+

asp.net mvc各版本特性一览

1、ASP.NET MVC 1 2007年2月,ScottGu草拟编写了ASP.NET MVC的内核程序。 ASP.NET MVC 1 于2009年3月13日正式发布。2、ASP.NET MVC 2 ASP.NET MVC2于2010年3月发布。 ASP.NET MVC2的部分主要特点如下: ● 带有自定义模板的UI辅助程序 ● 在客户端和服务器端基于特性的模型验证 ● 强类

三五月儿的专栏 4071

基于STM32L4XX、HAL库的AD7768BSTZ 模数转换器ADC驱动程序设计

/ 默认SPI配置。// 读取通道数据命令。// 通过SYNC_IN引脚触发转换(如果使用)// 处理数据...// 或者通过SPI命令。// 初始化AD7768。// SPI1引脚配置。

zhusl6688的博客 460

ASP.NET MVC基于标注特性的Model验证:ValidationAttribute

通过前面的介绍我们知道ModelValidatorProviders的静态只读Providers维护着一个全局的ModelValidatorProvider列表,最终用于Model验证的ModelValidator都是通过这些ModelValidatorProvider来提供的。对于该列表默认包含的三种ModelValidatorProvider来说,DataAnnotationsModelVal

3761

把 SAP Fiori Launchpad Designer 的 Catalog 与 Group 传输讲透:从 CONF、CUST 到 Transport Request 的完整理解

SAP Fiori项目中,catalog和group的传输问题往往源于对FLPD层次模型的理解不足。FLPD包含configuration(系统级)和customizing(客户端级)两个层面,分别对应workbench request和customizing request传输方式。常见误区包括:混淆/UI2/FLPD_CONF和/UI2/FLPD_CUST入口、未提前创建传输请求、不了解层次覆盖机制(customizing会覆盖configuration)。当客户端修改configuration层的对象

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 98

【路径规划】Theta_star算法机器人栅格地图最短路径规划【含Matlab源码 2618期】

Theta_star算法机器人栅格地图最短路径规划 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 362

ASP.NET MVC 5 02 - ASP.NET MVC 1-5 各版本特点

参考书籍:《ASP.NET MVC 4 高级编程》、《ASP.NET MVC 5 高级编程》、《C#高级编程(第8版)》、《使用ASP.NET MVC开发企业及应用》、度娘谷歌等。      前言:     前一篇只简单的介绍了ASP.NET和ASP.NET MVC,有朋友说要点干货。好吧。那就来点干货。     正好我也是真心想系统性的整整MVC4和5,以前也没有深入弄过,所以这次我也是

laoyingat的专栏 1707

阿里云百炼全解析:一站式大模型开发平台的架构与行业实践

摘要: 阿里云百炼平台通过一站式架构革新大模型开发范式,将传统碎片化工具链整合为统一工作流,实现开发周期从月级到小时级的跃迁。其核心架构包含接入层、引擎层与资源层,关键技术突破包括MCP服务协议、多模态引擎及高性能训练优化。平台提供全生命周期开发支持,从数据准备到模型部署,并通过VPC隔离、数据加密构建企业级安全体系。已在医疗、电力等行业实现显著增效,如阿斯利康药物分析系统准确率提升至95%。未来将向多Agent协同、边缘计算等方向演进,推动AI技术深度融入产业核心。

fudaihb的博客 1988

《Pro ASP.NET MVC 3 Framework》译文目录

Pro ASP.NET MVC 3 Framework 精通ASP.NET MVC 3框架 原文:Pro ASP.NET MVC 3 Framework(3rd Edition), Adam Freeman and Steven Sanderson, Apress, 2011 书名:《精通ASP.NET MVC 3框架》 目 录 Part 1: Introducing

5801

AutoCAD中圆弧折线化方法与实现

在AutoCAD中,圆弧折线化是将圆弧曲线转换为由一系列线段组成的折线曲线的过程。本文将介绍如何使用LISP编写代码来实现圆弧折线化,并提供相应的源代码。上述示例代码将生成一个以坐标原点为圆心、起点为(5.0, 0.0, 0.0)、终点为(0.0, 5.0, 0.0)、半径为5.0、角度为90度的圆弧的折线表示。通过使用上述的LISP代码,你可以在AutoCAD中实现将圆弧转换为折线的功能。你可以根据需要修改代码中的参数来适应不同的圆弧转换需求。函数,并传入圆弧的起点、终点、圆心、半径和角度参数。

VcuOcaml的博客 1417

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

asp.net 5 新特性简述(学习笔记)

自从我大微软发布的asp.net 5的更新以来,网上有众多介绍它的文章,我大概翻了一遍之后概括为以下几点:1.多平台运行(Windows、linux、MacOS)asp.net 5版本以后使用一套DN工具和命令集来管理运行环境、包引用,具体说明请参阅: http://www.cnblogs.com/shanyou/p/4589930.html 和 https://github.com/aspne

陈峰的专栏 2394

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Asp.Net mvc基础

Asp.Net mvc (一)MVC模式简介 (1)模型(models):描述数据,修改,操作数据的业务 (2)视图(View):应用程序用户界面的显示 (3)控制器(Controller):处理整个应用程序的逻辑通信 (4)mvc是,models,view,controller的简写与简称 (5)Asp.Net mvc是一种wep应用程序的框架,mvc模式应用于Asp.Net框架 ...

覃庆奖 839

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[Asp.net MVC]Asp.net MVC5系列——Razor语法

目录 概念 Razor语法 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net MVC]Asp.net MVC5系列——添加模型 [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据 [Asp.n

Litt_J的专栏 2597

部署asp.net mvc_在ASP.NET 2.0上部署ASP.NET MVC

部署asp.net mvcThis post will be filled with disclaimers and warnings. They are not just to CYA, but also to C my A and avoid my getting sacked. 这篇文章将充满免责声明和警告。 他们不仅是为了CYA ,而且是为了C我的A,并避免我被解雇。 I've been...

cunfuteng7334的博客 409

Asp.Net MVC EF各版本区别

2009年發行ASP.NET MVC 1.0版 2010年發行ASP.NET MVC 2.0版,VS2010 2011年發行ASP.NET MVC 3.0版+EF4,需要.Net4.0支持,VS2011 2012年發行ASP.NET MVC 4.0版+EF5,需要.Net4.0支持,VS2012 2013年發行ASP.NET MVC 5.0版+EF6,需要.Net4.5支持,VS2013

lovegonghui的专栏 1426

(0)ASP.NET Core 简单介绍 和开发环境搭建 - ASP.NET从MVC5升级到MVC6

ASP.NET从MVC5升级到MVC6 总目录 ASP.NET Core 首先,ASP原本只是一种技术,这种技术从上个世纪90年代就有了。 Active Service Page 和 Java Service Page 是相同的概念。 古老的WebForm技术,其实是正统的ASP.NET技术。刚开始的时候,代码和HTML都是写在一起的。同一个文件里面上半部分是C#代码,下半部分是HTML代码。 随...

weixin_34247155的博客 690
上一篇: ASP.NET MVC 5 (三) VS使用NuGet安装Bootstrap与使用Bootstrap
下一篇: ASP.NET MVC 5 (五)c#的lambda表达式、LinQ和Async异步处理
DoongBo
博客等级 码龄10年 25粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值