ASP.NET——MVC编程

一、什么是MVC编程模式

ASP.NET支持三种不同的开发模式:

WebPages(Web页面)、WebForms(Web窗体)、MVC(Model-View-Controller 模型-视图-控制器)

MVC是ASP.NET三种编程模式中的一种,是一种使用MVC(Model-View-Controller 模型-视图-控制器)设计创建Web应用程序的模式。

二、MVC设计模式

MVC分层有助于管理复杂的应用程序,可以让开发者在一个时间内关注一个方面,例如,开发者可以在不依赖业务逻辑的情况下进行视图设计。同时让应用程序的测试更加容易。

同时也简化了分组开发。不同开发人员可同时对视图,控制器逻辑,业务逻辑进行开发。

2.1)Model (模型)

Model(模型)表示应用程序核心(比如数据库记录列表)

是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据

2.2)View(视图)

View(视图)显示数据(数据库记录)

是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的

2.3)Controller(控制器)

Controller(控制器)处理输入(写入数据库记录)

是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

2.4)三者之间的交互关系

2.4.1)用户通过视图进行操作,如点击按钮、输入文本等,这些操作会触发相应的事件,视图将这些事件传递给控制器
2.4.2)控制器接收到事件后,根据事件类型和业务逻辑,调用模型中的方法来处理数据
2.4.3)模型处理完数据后,将结果返回给控制器
2.4.4)控制器根据模型返回的结果,选择合适的视图来展示数据,并将数据传递给视图,视图将数据展示给客户

三、C#中MVC模式的简单示例

在ASP.NET MVC模式中,MVC模式的应用较为典型,以下是一个简单示例:

3.1) 模型

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public decimal Price { get; set; }
}

public class ProductRepository
{
    private List<Product> products = new List<Product>
    {
        new Product { ProductId = 1, ProductName = "Product 1", Price = 10.99m },
        new Product { ProductId = 2, ProductName = "Product 2", Price = 19.99m }
    };

    public List<Product> GetAllProducts()
    {
        return products;
    }
}

3.2)视图

在Views文件夹下创建Product文件夹,再在该文件夹下创建Index.cshtml文件,代码如下

@model IEnumerable<MvcApp.Models.Product>

<h2>Product List</h2>

<ul>
    @foreach (var product in Model)
    {
        <li>@product.ProductName - $@product.Price</li>
    }
</ul>

3.3)控制器

public class ProductController : Controller
{
    private ProductRepository productRepository;

    public ProductController()
    {
        productRepository = new ProductRepository();
    }

    public ActionResult Index()
    {
        var products = productRepository.GetAllProducts();
        return View(products);
    }
}

// Product 类和 ProductRepository 类构成了模型部分,负责处理产品数据。ProductController 是控制器,用于处理用户请求并将数据传递给视图。Index.cshtml 是视图,用于展示产品列表数据。

四、MVC模式的优势与劣势

4.1 )MVC模式的优势

4.1.1 )分离关注点

        使代码结构更清晰,各个部分的职责明确,易于维护和扩展。项目结构更加i清晰,易于理解和管理。在需要对某一功能进行修改和扩展时,开发人员可以快速定位到对应的模块进行操作,不会影响其他无关部分,大大的提高了代码的可维护性

4.1.2 )提高可测试性

        模型和控制器可以独立进行单元测试,提高了代码的可测试性和质量。同时,在测试的过程中可以通过使用模拟对象来代替真实的依赖对象,比如在测试控制器时,可以模拟模拟对象的行为,一边更好的控制测试环境,确保测试的准确性和可重复性

4.1.3 )支持团队协作

        不同的开发人员可以分别负责模型、视图和控制器的开发,提高开发效率,开发人员在各自的模块进行开发,减少了因代码修改而产生的冲突,在代码合并时,更容易解决可能出现的问题,保证项目的顺利进行

4.1.4 )增强可扩展性

        当需要添加新的功能或修改业务逻辑时,只需要在相应的模块中进行修改,不会影响其他模块的功能,大大提高了代码的可维护性。同时,MVC 模式允许将不同的功能模块以插件的形式进行开发和集成,每个插件可以包含自己的模型、视图和控制器,方便地与主应用程序进行集成,实现功能的扩展和定制

4.2 )MVC模式的劣势

4.2.1)开发复杂性增加

        对于初学者来说,要理解和掌握MVC模式需要一定的时间和学习成本,需要去了解他们之间的关系,以及C#中如何实现这种架构模式

4.2.2)配置和搭建复杂

        在 C# 中使用 MVC 模式,尤其是在一些框架如ASP.NET MVC 中,需要进行一些配置和搭建工作,如路由配置、依赖注入配置等。这些配置工作可能会比较繁琐,对于不熟悉框架的开发人员来说,可能会出现配置错误,导致应用程序出现问题

4.2.3)数据传递复杂

        在 MVC 架构中,数据需要在模型、控制器和视图之间进行传递,可能需要进行数据的转换和封装等操作,这也可能会对性能产生一定的影响。特别是当传递大量数据或复杂对象时,性能问题可能会更加明显

4.2.4)会造成额外的开销

        MVC 模式中的模型、视图和控制器之间的交互可能会带来一些额外的性能开销。例如,控制器调用模型方法、传递数据给视图等操作都需要一定的时间和资源,在一些对性能要求极高的场景下,可能会影响应用程序的整体性能

4.2.5)视图和控制器的紧耦性

些 C# 的 MVC 框架中,视图和控制器之间可能存在一定的紧耦合关系。视图可能需要依赖于特定的控制器方法或属性来获取数据,或者控制器需要了解视图的具体实现细节来进行数据传递和操作,这可能会导致在视图或控制器进行修改时,需要同时修改另一方,违反了松耦合的设计原则,使得视图中的一些逻辑可能难以在其他项目或模块中进行复用,降低了代码的复用性

五、ASP.NET MVC框架开发示例

使用C#中的ASP.NET MVC框架开发Web应用程序的示例

5.1 )创建项目

首先,创建一个新的ASP.NET MVC项目,在VS中,选择 “创建新项目”,然后选择 “ASP.NET Web 应用程序”,并选择 “MVC” 模板

5.2 )模型(Model)

在Models文件夹中创建一个TaskModel类,用于表示任务对象,包含任务的基本信息和相关操作

using System.Collections.Generic;

namespace MvcTaskManager.Models
{
    public class TaskModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsCompleted { get; set; }

        // 模拟数据存储
        private static List<TaskModel> tasks = new List<TaskModel>();

        // 创建任务
        public static void CreateTask(TaskModel task)
        {
            tasks.Add(task);
        }

        // 获取所有任务
        public static List<TaskModel> GetAllTasks()
        {
            return tasks;
        }

        // 删除任务
        public static void DeleteTask(int id)
        {
            tasks.RemoveAll(t => t.Id == id);
        }
    }
}

5.3 )控制器(Controller)

在Controllers文件夹中创建一个TaskController类,用于处理用户请求并调用相应的模型方法

using System.Web.Mvc;
using MvcTaskManager.Models;

namespace MvcTaskManager.Controllers
{
    public class TaskController : Controller
    {
        // 显示任务列表
        public ActionResult Index()
        {
            var tasks = TaskModel.GetAllTasks();
            return View(tasks);
        }

        // 显示创建任务的页面
        public ActionResult Create()
        {
            return View();
        }

        // 处理创建任务的请求
        [HttpPost]
        public ActionResult Create(TaskModel task)
        {
            if (ModelState.IsValid)
            {
                TaskModel.CreateTask(task);
                return RedirectToAction("Index");
            }
            return View(task);
        }

        // 处理删除任务的请求
        public ActionResult Delete(int id)
        {
            TaskModel.DeleteTask(id);
            return RedirectToAction("Index");
        }
    }
}

5.4 )视图(View)

在View/Task文件夹中创建以下视图

5.4.1 )Index.cshtml(任务列表视图)
@model IEnumerable<MvcTaskManager.Models.TaskModel>
@{
    ViewBag.Title = "任务列表";
}

<h2>任务列表</h2>
<ul>
    @foreach (var task in Model)
    {
        <li>
            @task.Name - @(task.IsCompleted? "已完成" : "未完成")
            @Html.ActionLink("删除", "Delete", new { id = task.Id })
        </li>
    }
</ul>
@Html.ActionLink("创建新任务", "Create")
5.4.2 )Create.cshtml(创建任务视图)
@model MvcTaskManager.Models.TaskModel
@{
    ViewBag.Title = "创建任务";
}

<h2>创建任务</h2>
@using (Html.BeginForm("Create", "Task", FormMethod.Post))
{
    <div>
        <label for="Name">任务名称:</label>
        @Html.TextBoxFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>
    <div>
        <input type="submit" value="创建" />
    </div>
}

5.5 )路由配置

在RouteConfig.cs文件中配置路由,确保请求能够正确路由到相应的控制器和操作

using System.Web.Mvc;
using System.Web.Routing;

namespace MvcTaskManager
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Task", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

5.6 )启动应用程序

运行应用程序,可以看到以下功能

        5.6.1)访问/Task/Index会显示任务列表
        5.6.2)点击“创建新任务”会进入创建任务界面
        5.6.3)在创建任务页面输入任务名称并提交会创建一个新任务,并返回到任务列表页面
        5.6.4)任务列表页面中,每个任务后面有一个“删除”链接,点击删除该任务

5.7 )注意事项

5.7.1)这是一个简单的示例,实际应用中,需要更加复杂的业务逻辑和数据存储,如使用数据库存储任务数据
5.7.2)可以Entity Framework使用等ORM工具与数据库进行交互,将TaskModel映射到数据库
5.7.3)可以添加更多的验证逻辑,例如在TaskModel中添加属性验证,在Create方法中检查用户输入的合法性

通过这个示例,你可以看到如何使用 C# 的 MVC 模式开发一个简单的 Web 应用程序,将业务逻辑、用户界面和请求处理清晰地分离,提高开发效率和代码的可维护性。根据需要,可以进一步扩展和优化该示例,添加更多的功能和页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956666.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

领域算法 - 大数据处理

大数据处理 文章目录 大数据处理一&#xff1a;hash分流二&#xff1a;双层桶1&#xff1a;什么是双层桶2&#xff1a;双层桶案例 三&#xff1a;外排序1&#xff1a;经典问题2&#xff1a;位图排序法3&#xff1a;多路归并排序 四&#xff1a;bitMap1&#xff1a;添加 -> 异…

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标 使用FPGA实现AD模块驱动采集模拟电压&#xff0c;通过以太网上传到电脑上位机。 二、框架设计 数据位宽转换模块&#xff08;ad_10bit_to_16bit&#xff09;&#xff1a;为了方便数据传输&#xff0c;数据位宽转换模块实现了将十位的 AD 数据转换成十六位&#…

JavaWeb 快速入门 javaScript(预测爆文) | 019

今日推荐语 人经常推翻自己&#xff0c;经常不同意昨天的自己&#xff0c;这也是常态。——纪静蓉 日期 学习内容 打卡编号2025年01月20日JavaWeb快速入门javaScript019 前言 哈喽&#xff0c;我是菜鸟阿康。 今天大概学习了下 js 的的基础知识&#xff0c;js …

[c语言日寄]内存初阶:大端字节序和小端字节序

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

【MySQL】数据库-图书管理系统(CC++实现)

一.预期功能 该图书管理系统设计提供基本的设计模版&#xff0c;涉及数据库的增删查改等操作&#xff0c;包含登录功能&#xff0c;图书管理功能&#xff0c;图书借阅功能&#xff0c;用户管理功能等基础功能&#xff0c;详细功能查看以下菜单表&#xff0c;共包含三个菜单&am…

Linux-C/C++--深入探究文件 I/O (下)(文件共享、原子操作与竞争冒险、系统调用、截断文件)

经过上一章内容的学习&#xff0c;了解了 Linux 下空洞文件的概念&#xff1b;open 函数的 O_APPEND 和 O_TRUNC 标志&#xff1b;多次打开同一文件&#xff1b;复制文件描述符&#xff1b;等内容 本章将会接着探究文件IO&#xff0c;讨论如下主题内容。  文件共享介绍&…

RabbitMQ-消息可靠性以及延迟消息

目录 消息丢失 一、发送者的可靠性 1.1 生产者重试机制 1.2 生产者确认机制 1.3 实现生产者确认 &#xff08;1&#xff09;开启生产者确认 &#xff08;2&#xff09;定义ReturnCallback &#xff08;3&#xff09;定义ConfirmCallback 二、MQ的持久化 2.1 数据持久…

springboot基于前后端分离的摄影知识网站

Spring Boot 基于前后端分离的摄影知识网站 一、项目概述 Spring Boot 基于前后端分离的摄影知识网站&#xff0c;是一个专为摄影爱好者、专业摄影师打造的知识共享与交流平台。借助 Spring Boot 强大的后端架构搭建能力&#xff0c;结合前端独立开发的灵活性&#xff0c;整合…

B站评论系统的多级存储架构

以下文章来源于哔哩哔哩技术 &#xff0c;作者业务 哔哩哔哩技术. 提供B站相关技术的介绍和讲解 1. 背景 评论是 B站生态的重要组成部分&#xff0c;涵盖了 UP 主与用户的互动、平台内容的推荐与优化、社区文化建设以及用户情感满足。B站的评论区不仅是用户互动的核心场所&…

Linux Bash 中使用重定向运算符的 5 种方法

注&#xff1a;机翻&#xff0c;未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…

什么是三高架构?

大家好&#xff0c;我是锋哥。今天分享关于【什么是三高架构?】面试题。希望对大家有帮助&#xff1b; 什么是三高架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 “三高架构”通常是指高可用性&#xff08;High Availability&#xff09;、高性能&#xff…

хорошо哈拉少wordpress俄语主题

хорошо哈拉少wordpress俄语主题 wordpress俄文网站模板&#xff0c;推荐做俄罗斯市场的外贸公司建俄语独立站使用。 演示 https://www.jianzhanpress.com/?p7360

计算机组成原理--笔记二

目录 一.计算机系统的工作原理 二.计算机的性能指标 1.存储器的性能指标 2.CPU的性能指标 3.系统整体的性能指标&#xff08;静态&#xff09; 4.系统整体的性能指标&#xff08;动态&#xff09; 三.进制计算 1.任意进制 > 十进制 2.二进制 <> 八、十六进制…

C# OpenCV机器视觉:特征匹配 “灵魂伴侣”

在一个阳光仿佛被施了魔法&#xff0c;欢快得直蹦跶的早晨&#xff0c;阿强像个即将踏上神秘寻宝之旅的探险家&#xff0c;一屁股墩在实验室那张堆满各种奇奇怪怪小玩意儿的桌前。桌上&#xff0c;零件、线路、半成品设备乱成一团&#xff0c;唯有他那宝贝电脑屏幕散发着清冷又…

搭建一个基于Spring Boot的驾校管理系统

搭建一个基于Spring Boot的驾校管理系统可以涵盖多个功能模块&#xff0c;例如学员管理、教练管理、课程管理、考试管理、车辆管理等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的系统。 1. 项目初始化 使用 Spring Initializr 生成一个Spring Boot项目&am…

基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Android四种方式刷新View

Android四种方式刷新View 1.前言&#xff1a; 最近在切换主题时有个TextView是Gone的状态&#xff0c;切换主题后内容没有显示&#xff0c;于是排查代码&#xff0c;刚开始以为是textView没有设置内容&#xff0c;但是打印日志和排查发现有setText. 2.View.VISIBLE与View.GO…

主从复制

简述mysql 主从复制原理及其工作过程&#xff0c;配置一主两从并验证。 主从原理&#xff1a;MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二…

(二)afsim第三方库编译(qt编译)

注意&#xff1a;源码编译的路径不能有中文否则报错&#xff0c;压缩包必须用官网下载的xz格式解压的才可以&#xff0c;否则sudo ./configure命令找不到 先编译openssl3.1.1软件包&#xff0c;否则编译的qt库将不支持network&#xff0c;相关库的编译(上文&#xff08;一&…

消除抖动模块code

消抖部分code timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2025/01/19 20:58:44 // Design Name: // Module Name: key_filter // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revis…