前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MVC3.0+knockout.js+Ajax 实现简单的增删改查

MVC3.0+knockout.js+Ajax 实现简单的增删改查

作者头像
写代码的猿
发布于 2019-04-11 06:51:59
发布于 2019-04-11 06:51:59
2.4K00
代码可运行
举报
文章被收录于专栏:平凡少年平凡少年
运行总次数:0
代码可运行

    自从到北京入职以来就再也没有接触MVC,很多都已经淡忘了,最近一直在看knockout.js 和webAPI,本来打算采用MVC+knockout.js+webAPI来实现这个小DEMO的,无奈公司用的开发环境是VS2010只安装了MVC3.0。那就先练习一下MVC和knockout吧。博客园里有很多这样的文章,但是觉得还是要自己亲自动手写一下。

    本文不讲解knockout.js和webAPI ,不了解的同学可以百度一下。下一篇博文将采用webAPI和Redis缓存作为服务端重写该项目。

    我们采用MVC和knockout.js实现一个简单的学生信息管理,实现学生信息的增删改查功能。通过knockout.js来进行数据的绑定,你会发现代码变得很优雅。在该项目中我们会用到razor视图以及Layout模板、RenderSection和Html.Partial等razor语法中的基本功能

项目需要添加knockout.js文件的引用,可以到官网上下载。

一、我们新建一个空的MVC项目

knockout.js在Script文件夹中,只用关注带黄色底纹的文件,其他没有用。

二、文件讲解

1、  我们先来看看_Layout.cshtml文件

_Layout.cshtml作为模板页面,Home文件夹下的所有*.cshtml都会引用该模板页,在_Layout.cshtml我们定义了@RenderSection("Header",false)一个区块,那么我们就可以在引用的具体页面中在该区域内添加css和js脚本了。@Html.Partial("FootPartialPage")说明我们引用了FootPartialPage. Cshtml的视图。

下面我们来看一下具体的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/knockout-2.3.0.js")" type="text/javascript"></script>
    @RenderSection("Header",false)
</head>

<body>
    <div class="top">
    
    </div>

    <div class="content">
        @RenderBody()
    </div>

    <div class="foot">
        @Html.Partial("FootPartialPage")
    </div>
</body>
</html>

2、Models/Students.cs

Students为我们定义的一个学生类的实体,作为数据的传递。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApplication1.Models
{
    public class Students
    {
        public string Num { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Sex { get; set; }
        public string Class { get; set; }
    }
}

3、  HomeController.cs控制器

HomeController中我们定义了很多Action,实现增删改查功能,直接看代码吧,Action中的代码最好配合着View来看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models;

using System.Runtime.Serialization.Json;
using System.IO;


namespace MvcApplication1.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        private static List<Students> listStu = new List<Students>()
        {
            new Students(){Num="s0001",Name="张三",Age=19,Sex="man",Class="计算机1班"},
            new Students(){Num="s0002",Name="李四",Age=20,Sex="man",Class="计算机1班"},
            new Students(){Num="s0003",Name="王五",Age=18,Sex="man",Class="计算机1班"},
            new Students(){Num="s0004",Name="小红",Age=17,Sex="women",Class="计算机'\"1班"},
        };
        //首页
        public ActionResult Index()
        {
            //序列化为json数据
            DataContractJsonSerializer Serializer = new DataContractJsonSerializer(typeof(List<Students>));
            using (MemoryStream ms = new MemoryStream())
            {
                Serializer.WriteObject(ms,listStu);
                ms.Flush();
                ms.Seek(0, SeekOrigin.Begin);
                StreamReader sr = new StreamReader(ms);
                ViewBag.Data = sr.ReadToEnd();
            }
            return View(ViewBag);
        }
        //新增页面
        public ActionResult Add()
        {
            return View();
        }
        //新增事件
        [HttpPost]
        public JsonResult Add(FormCollection form)
        {
            listStu.Add(
            new Students() { Num = form["Num"], Name = form["Name"], Age = Convert.ToInt32(form["Age"]), Sex = form["Sex"], Class = form["Class"] }
            );
            return Json(new { type = "success" });
        }
        //编辑页面
        public ActionResult edit(string id)
        {
            var item = listStu.Find(it => it.Num == id);
            //序列化为json数据
            DataContractJsonSerializer Serializer = new DataContractJsonSerializer(typeof(Students));
            using (MemoryStream ms = new MemoryStream())
            {
                Serializer.WriteObject(ms, item);
                ms.Flush();
                ms.Seek(0, SeekOrigin.Begin);
                StreamReader sr = new StreamReader(ms);
                ViewBag.Data = sr.ReadToEnd();
            }
            return View("eidt");
        }
        //编辑事件
        [HttpPost]
        public JsonResult edit(FormCollection form)
        {
            string Num = form["Num"];
            var item = listStu.Find(it => it.Num == Num);
            item. Name = form["Name"];
            item. Age = Convert.ToInt32(form["Age"]);
            item. Sex = form["Sex"];
            item. Class = form["Class"];
            return Json(new { type = "success" });
        }
        //删除
        [HttpPost]
        public JsonResult Del(string id)
        {
            var item = listStu.Find(it => it.Num == id);
            listStu.Remove(item);
            return Json(new { type = "sucess" });
        }
       
    }
}

4、  Index.cshtml视图

Index.cshtm是我们的首页,接收一个@ViewBag.Data的jason数据(该json数据是list<student>序列化来的,查看源代码就可以看到该数据),通过knockout.js把数据绑定到页面中。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section Header{
<script type="text/javascript">
    var data =@Html.Raw(@ViewBag.Data);
    function ViewModel(){
        var self=this;
        self.students=ko.observableArray(data);//添加动态监视数组对象
        //删除
        self.remove=function(stu){
            $.ajax({
                url:"/Home/Del/"+stu.Num,
                type:"post",
                dataType:"json",
                success:function(json){
                    alert(json.type);
                    self.students.remove(stu);
                }
            })
        }
        //编辑
        self.edit=function(stu){
            window.location.href='/Home/edit/'+stu.Num;
        };
        self.Count=ko.computed(function(){
            return self.students().length;
        });
    }
    $(document).ready(function(){
        var vm=new ViewModel();
        /* 新增元素
        var obj=new Object();
        obj.Num='s0002';
        obj.Name='eric';
        obj.Age='25';
        obj.Sex='男';
        obj.Class='计算机2班';
        vm.students.push(obj);
        */
        ko.applyBindings(vm);
    })
</script>
}
<div style=" margin-bottom:5px;">
    <a href="/Home/Add/">增加</a>
</div>
<table cellpadding="1" cellspacing="1" border="1" width="100%">
<tr>
    <th style="width:auto">姓名</th>
    <th style="width:auto">年龄</th>
    <th style="width:auto">性别</th>
    <th style="width:auto">班级</th>
    <th style="width:auto">操作</th>
</tr>
<tbody data-bind="foreach:students">
<tr>
    <td data-bind="text:Name"></td>
    <td data-bind="text:Age"></td>
    <td data-bind="text:Sex"></td>
    <td data-bind="text:Class"></td>
    <td > <a href="javascript:" data-bind="click:$root.remove">删除</a> <a href="javascript:" data-bind="click:$root.edit">修改</a></td>
</tr>
</tbody>

</table>
<div data-bind="text:Count"></div>

5、  eidt.cshtml视图

eidt.cshtml是编辑学生信息的页面,与Index.cshtm页面类似,该页面也是接收一个json数据,并通过knockout.js把数据绑定到页面中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@{
    ViewBag.Title = "eidt";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section Header{
<script type="text/javascript">
    var data =@Html.Raw(@ViewBag.Data);
     function ViewModel(){
        var self=this;
        self.Num=ko.observable(data.Num);
        self.Name=ko.observable(data.Name);
         self.Age=ko.observable(data.Age);
         self.Sex=ko.observable(data.Sex);
         self.Class=ko.observable(data.Class);
        self.Commit1=function(){
            //alert(self.Num()+","+self.Name()+","+self.Age()+","+self.Sex()+","+self.Class());
            $.ajax({
                type:"post",
                url:"/Home/edit",
                data:{Num:self.Num(),Name:self.Name,Age:self.Age,Sex:self.Sex,Class:self.Class},
                success:function(json){
                    alert(json.type);
                }
            })
        }
        self.back=function(){
             window.location.href='/Home/Index';
        };
    }
    $(document).ready(function(){
        var vm=new ViewModel();
        ko.applyBindings(vm);
    })
</script>
}
<h2>eidt</h2>
<table cellpadding="1" cellspacing="1" border="1" width="100%">
<tr>
    <td style="width:100px">姓名:</td>
    <td><input type="text" data-bind="value:Name" /></td>
</tr>
<tr>
    <td style="width:100px">年龄:</td>
    <td><input type="text" data-bind="value:Age" /></td>
</tr>
<tr>
    <td style="width:100px">性别:</td>
    <td><input type="text" data-bind="value:Sex" /></td>
</tr>
<tr>
    <td style="width:100px">班级:</td>
    <td><input type="text" data-bind="value:Class" /></td>
</tr>
</table>

<div style=" margin-top:5px">
<input type="button" data-bind="click:$root.Commit1" value="提交"/> &nbsp;&nbsp;
<input type="button" data-bind="click:$root.back" value="返回"/> 
</div> 

6、  Add.cshtml 视图

Add.cshtml是添加用户信息的页面与eidt.cshtml页面非常类似,直接上代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@{
    ViewBag.Title = "Add";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section Header{
<script type="text/javascript">
     function ViewModel(){
        var self=this;
        self.Num=ko.observable();
        self.Name=ko.observable();
         self.Age=ko.observable();
         self.Sex=ko.observable();
         self.Class=ko.observable();
         self.Commit1 = function () {
             $.ajax({
                 type: "post",
                 url: "/Home/Add",
                 data: { Num: self.Num(), Name: self.Name(), Age: self.Age(), Sex: self.Sex, Class: self.Class },
                 success: function (json) {
                     alert(json.type);
                 }
             })
         }
        self.back=function(){
        window.location.href='/Home/Index';
        };
    }
    $(document).ready(function(){
        var vm=new ViewModel();
        ko.applyBindings(vm);
    })
</script>
}
<h2>Add</h2>

<table cellpadding="1" cellspacing="1" border="1" width="100%">
<tr>
    <td style="width:100px">学号:</td>
    <td><input type="text" data-bind="value:Num" /></td>
</tr>
<tr>
    <td style="width:100px">姓名:</td>
    <td><input type="text" data-bind="value:Name" /></td>
</tr>
<tr>
    <td style="width:100px">年龄:</td>
    <td><input type="text" data-bind="value:Age" /></td>
</tr>
<tr>
    <td style="width:100px">性别:</td>
    <td><input type="text" data-bind="value:Sex" /></td>
</tr>
<tr>
    <td style="width:100px">班级:</td>
    <td><input type="text" data-bind="value:Class" /></td>
</tr>
</table>

<div style=" margin-top:5px">
<input type="button" data-bind="click:$root.Commit1" value="提交"/> &nbsp;&nbsp;
<input type="button" data-bind="click:$root.back" value="返回"/> 
</div> 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Knockout简单用法
    在最近做的一个项目中,页面数据全部通过js ajax调用webapi接口获取,也就是说页面的数据全部使用javascript脚本填充,这就想到了使用一个MVVM模式的js框架来做这件事,在该项目中选择了Knockout.js。下面简单介绍一下Knockout的基本用法,作为备忘。
写代码的猿
2019/04/11
1.3K0
MVVM(Knockout.js)的新尝试:多个Page,一个ViewModel
对于面向数据的Web应用来说,MVVM模式是一项不错的选择,它借助JS框架提供的“绑定”机制是我们无需过多关注UI(HTML)的细节,只需要操作绑定的数据源。MVVM最早被微软应用于WPF/SL的开发,所以针对Web的MVVM框架来说,Knockout.js(以下简称KO)无疑是“根正苗红”。在进行基于KO的Web应用开发时,我们一般会为具体的Web页面定义针对性的ViewModel,但是在很多情况下很多页面具有相同的UI结构和操作行为,考虑到重用和封装,我们是否为它们创建一个共享的ViewModel呢。最
蒋金楠
2018/01/15
2.8K0
MVVM(Knockout.js)的新尝试:多个Page,一个ViewModel
通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
较之面向最终消费者的网站,企业级Web应用对用户体验的要求要低一些。不过客户对“用户体验”的要求是“与日俱增”的,很多被“惯坏了”的用户已经不能忍受Postback带来的页面刷新,所以Ajax在企业级Web应用中得到了广泛的应用。企业级Web应用的一个特点是以“数据处理”为主,所以“面向绑定”的Knockout.js 是一个不错的选择。ASP.NET Web API,作为.NET平台最好的REST服务开发平台(主要与WCF相比),则可以以服务的形式提供对数据的后台处理。 一、一个简单的基于CRUD的Web应
蒋金楠
2018/01/15
1.3K0
通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
KnockoutJS的基础用法
如今,各种前端框架应接不暇,令人眼花缭乱,有时不得不感叹作为程序猿也真是苦逼,总有学不完的技术,何时是尽头,除非你转化!苦海无边,回头是不是岸,由你决定!
javascript.shop
2019/09/04
5.6K0
KnockoutJS的基础用法
Knockout.Js官网学习(简介)
最近一段时间在网上经常看到关于Knockout.js文章,于是自己就到官网看了下,不过是英文的,自己果断搞不来,借用google翻译了一下。然后刚刚发现在建立asp.net mvc4.0的应用程序的时候,建完之后我直接在项目的Scripts中看到了
aehyok
2018/09/11
2.3K0
Knockout.Js官网学习(简介)
Magicodes.WeiChat——媒体资源选择组件之media-choice(开源)
mediaType:默认选择的媒体类型,其中(0:图片;1,语音;2,视频;5,图文)
雪雁-心莱科技
2018/12/27
4170
KnockoutJS语法
  假设我们的页面输入区域有一个div用来展示一件物品的名字,同时有一个输入框用来编辑这件物品的名字
javascript.shop
2019/09/04
2.4K0
KnockoutJS语法
Knockout.Js官网学习(style绑定、attr绑定)
style绑定是添加或删除一个或多个DOM元素上的style值。比如当数字变成负数时高亮显示,或者根据数字显示对应宽度的Bar。(注:如果你不是应用style值而是应用CSS class的话,请参考CSS绑定。)
aehyok
2018/09/11
4K0
Knockout.Js官网学习(style绑定、attr绑定)
Knockout.Js官网学习(checked 绑定)
checked绑定是关联到checkable的form表单控件到view model上 - 例如checkbox(<input type='checkbox'>)或者radio button(<input type='radio'>) 。当用户check关联的form表单控件的时候,view model对应的值也会自动更新,相反,如果view model的值改变了,那控件元素的check/uncheck状态也会跟着改变。
aehyok
2018/09/11
2.2K0
Knockout.Js官网学习(checked 绑定)
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查
文章于2016-12-17日重写 在第八讲中,我们已经做到了怎么样分页。这一讲主要讲增删改查。第六讲的代码已经给出,里面包含了增删改,大家可以下载下来看下。 这讲主要是,制作漂亮的工具栏,虽然ea
用户1149182
2018/01/16
1.9K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查
Knockout.Js官网学习(visible绑定)
让visible绑定到DOM元素上,使得该元素的hidden或visible取决于绑定的值。
aehyok
2018/09/11
1.6K0
MVC5+EasyUI+EF6增删改查以及登录登出的演示
创建StudentController、 及Index视图, 在Index上按F5运行
明志德道
2023/10/21
2620
MVC5+EasyUI+EF6增删改查以及登录登出的演示
Knockout.Js官网学习(click绑定)
click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数。大部分是用在button,input和连接a上,但是可以在任意元素上使用。
aehyok
2018/09/11
3K0
Knockout.Js官网学习(click绑定)
Knockout.Js官网学习(value绑定)
value绑定是关联DOM元素的值到view model的属性上。主要是用在表单控件<input>,<select>和<textarea>上。
aehyok
2018/09/11
2.2K0
Knockout.Js官网学习(value绑定)
Knockout.Js官网学习(event绑定、submit绑定)
event绑定在DOM元素上添加指定的事件句柄以便元素被触发的时候执行定义的JavaScript 函数。大部分情况下是用在keypress,mouseover和mouseout上。
aehyok
2018/09/11
2.6K0
Knockout.Js官网学习(event绑定、submit绑定)
Knockout.Js官网学习(监控属性Observables)
  现在已经知道如何创建一个简单的view model并且通过binding显示它的属性了。但是KO一个重要的功能是当你的view model改变的时候能自动更新你的界面。当你的view model部分改变的时候KO是如何知道的呢?答案是:你需要将你的model属性声明成observable的, 因为它是非常特殊的JavaScript objects,能够通知订阅者它的改变以及自动探测到相关的依赖。
aehyok
2018/09/11
1.5K0
Knockout.Js官网学习(监控属性Observables)
ASP.NET MVC增删改查带图片路径读取
主要完成单表的增加、修改、删除、查询、模糊查询的功能,以及根据图片名称显示对应的图片操作。
红目香薰
2022/11/30
1.4K0
ASP.NET MVC增删改查带图片路径读取
Knockout.Js官网学习(html绑定、css绑定)
html绑定到DOM元素上,使得该元素显示的HTML值为你绑定的参数。如果在你的view model里声明HTML标记并且render的话,那非常有用。
aehyok
2018/09/11
2.5K0
Knockout.Js官网学习(html绑定、css绑定)
Knockout.Js官网学习(创建自定义绑定)
你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等)。你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定。例如,你可以在form表单里自定义像grid,tabset等这样的绑定。
aehyok
2018/09/11
8090
Knockout.Js官网学习(创建自定义绑定)
Knockout.Js官网学习(enable绑定、disable绑定)
enable绑定使DOM元素只有在参数值为 true的时候才enabled。在form表单元素input,select,和textarea上非常有用。
aehyok
2018/09/11
2.3K0
Knockout.Js官网学习(enable绑定、disable绑定)
推荐阅读
相关推荐
Knockout简单用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文