今天使用mvc完成简单的增删改,内容比较简单,来熟悉一下mvc,数据库操作是用前面的ef,也算是温习一下ef吧。

新建mvc项目,在项目中的Models内添加ef,我这里只操作一下简单的user表。里面有id,name,sex,age字段。完成后如下

在Controller中添加user控制器,添加增删改查方法,下面是我在user控制器中添加的方法

 using System;
using System.Collections.Generic;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcCRUD.Controllers
{
public class UserController : Controller
{
//
// GET: /User/
Models.EFtestEntities db = new Models.EFtestEntities();
/// <summary>
/// 当做查询
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
//查询方法,在这个方法中要使用ef从数据库中查询出来数据
//接下来需要将查询出来的数据传递到视图页面,其实视图页面访问时也是编译成一个类
//视图页面类有个Model的属性,
List<Models.User> userList = db.Users.Where(u => u.Id != "").ToList();
return View(userList);
} public ActionResult Index1()
{
//查询方法,在这个方法中要使用ef从数据库中查询出来数据
//接下来需要将查询出来的数据传递到视图页面,其实视图页面访问时也是编译成一个类
//视图页面类有个Model的属性,
List<Models.User> userList = db.Users.Where(u => u.Id != "").ToList();
ViewBag.Index1 = userList;
return View("Index");
}
public ActionResult Index2()
{
//查询方法,在这个方法中要使用ef从数据库中查询出来数据
//接下来需要将查询出来的数据传递到视图页面,其实视图页面访问时也是编译成一个类
//视图页面类有个Model的属性,
List<Models.User> userList = db.Users.Where(u => u.Id != "").ToList();
ViewData["Index2"] = userList;
return View("Index");
}
public ActionResult Index3()
{
//查询方法,在这个方法中要使用ef从数据库中查询出来数据
//接下来需要将查询出来的数据传递到视图页面,其实视图页面访问时也是编译成一个类
//视图页面类有个Model的属性,
List<Models.User> userList = db.Users.Where(u => u.Id != "").ToList();
TempData["Index3"] = userList;
return View("Index");
} public string add(Models.User userModel)
{
//随机数
userModel.Id = Guid.NewGuid().ToString();
db.Users.Add(userModel);
int res = -;
res = db.SaveChanges();
if (res > )
return "add suc";
return "add fail";
}
public string remove(string id)
{
Models.User userModel = new Models.User();
userModel.Id = id;
db.Users.Attach(userModel);
db.Users.Remove(userModel);
int res = -;
res=db.SaveChanges();
if (res > )
return "remove suc";
return "remove fail";
}
[HttpGet]
public ViewResult update(string id)
{
Models.User userModel = db.Users.Where(u => u.Id == id).FirstOrDefault();
return View(userModel);
}
[HttpPost]
public string update(Models.User userModel)
{
DbEntityEntry<Models.User> entry = db.Entry<Models.User>(userModel);
entry.State = System.Data.EntityState.Unchanged;
entry.Property("name").IsModified = true;
int res = -;
res = db.SaveChanges();
if (res > )
return "update suc";
return "update fail";
}
}
}

然后添加index视图

 @{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@*注意,这是razor视图引擎的语法,使用@符号就是说明要写c#内容了*@
@{
object data = null;
if(Model!=null)
{
data = Model;
}
if (ViewBag.Index1 != null)
{
data = ViewBag.Index1;
}
if(ViewData["Index2"]!=null)
{
data = ViewData["Index2"];
}
if (TempData["Index3"] != null)
{
data = TempData["Index3"];
}
<table border="1">
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>操作</th>
</tr> @foreach (MvcCRUD.Models.User temp in data as List<MvcCRUD.Models.User>)
{
<tr>
<td>@temp.name</td>
<td>@temp.sex</td>
<td>@temp.age</td>
<td>
<a href="../user/update/@temp.Id">修改</a>
<a href="../user/remove/@temp.Id">删除</a>
</td>
</tr>
}
</table>
}
</div>
</body>
</html>

添加update视图

 @{
Layout = null;
}
@using MvcCRUD.Models;
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>update</title>
</head>
<body>
<form action="../update" method="post">
<input type="hidden" name="Id" value="@Model.Id" />
<div>
<table>
<tr>
<td>姓名:<input type="text" name="name" value="@Model.name" /></td>
</tr> </table>
<input type="submit" value="提交"/>
</div>
</form>
</body>
</html>

现在我们可以访问user控制器下的index,index1,index2,index3方法(页面内容都是一样的),下面是我的效果图

之所以一个查询写了三个方法是想说明控制器向view传递值有这四个方法。现在一次说一下这几个传值方法,

Model方法传值,前台页面类是有这个属性的,而前台页面类又是有控制器创建的,当创建时,控制器就会把Model赋给前台页面类的Model属性。注意,控制器中的view()是接受参数的,所以可以将model传递进去。viewbag是个动态类型,可以动态的添加属性,这与js中给类动态添加属性很像哦。viewdata是个键值对,这个没什么好说的。很好理解,添加键的同时赋值。这里需要说明的是viewbag与viewdata的数据是共享的,例如:给viewbag.temp赋值,使用viewdata["temp"]是可以取到这个值的,反过来亦然。tempdata也可以传值,但与前两者数据是不共享的。他有特殊的作用,以后学习。顺便说一下Model属性也可以通过viewdata.Model来访问。

这几个index方法里面我还用到了访问非同名的视图,方法就是在view()方法中传值指定要加载的视图。这是同一个控制器的写法,但是如果要加载其他控制器的视图,这里就要写全了,例如view("~/home/index");

点击修改,会是一个get请求,所以会走public ViewResult update(string id)这个方法,注意这里的参数名必须为id,因为我们的路由就这么规定的。例如点击学生2的修改,这里我只对名字进行修改,

这里还需要注意的是我们的updata视图里,每个元素的name值需要与Model的属性名一样,这样当提交的时候,它会自动的将表单中name值赋给Model的相应属性值。

例如我的表单中有个隐藏域,name=“Id”,姓名的txt的name="name",这样,当提交时,为post的方式,调用public string update(Models.User userModel)方法,这时就会将表单中的name=“Id”的值赋给Model.Id,name="name"的值赋给Model.name;

删除方法就更简单了,在这里就不多说了。先来说下cshtml内的用法吧

当写@时,razor视图引擎就会认为这后面就是c#代码了,而出现尖括号视图引擎就会认为是html标签。它会在两者之间自动的切换,特别灵活。

ASP.NET MVC 学习第二天的更多相关文章

  1. (转)ASP.NET MVC 学习第一天

    天道酬勤0322   博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅  | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习as ...

  2. ASP.NET MVC学习之视图篇(2)

    继ASP.NET MVC学习之视图(1)学习 4.HTML辅助器 虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用for ...

  3. ASP.NET MVC学习之模型验证详解

    ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...

  4. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  5. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  6. ASP.NET MVC学习之Ajax(完结)

    一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发aj ...

  7. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  8. ASP.NET MVC学习之控制器篇

    一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MV ...

  9. ASP.NET MVC学习系列(二)-WebAPI请求

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

随机推荐

  1. hdu 1530 最大团模板

    说明摘自:pushing my way 的博文 最大团 通过该博主的代码,总算理解了最大团问题,但是他实现时的代码效率却不算太高.因此在最后献上我的模板.加了IO优化目前的排名是: 6 yejinru ...

  2. asp.net EF model中的默认值设置

    在做数据库规划时,通常会规划一些系统字段,也就是由数据库本身自行指定默认值到这个字段上,创建新的“创建时间(CreateDate)”字段就会常常这样设计. 如果希望能有默认值,且让.net 程序在新增 ...

  3. DWZ (JUI) 教程 DWZ中dialog层的刷新

    在DWZ开发过程中经常会遇到的一种情况就是:在navTab页面中通过a标签打开一个dialog,在dialog层进行操作后,需要对该dialog层进行必要的刷新操作. 1.首先讲一下思路: 在非dia ...

  4. GitHub之上传文件

    github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.对于一般人来说公共仓库就已经足够了,而且我们也没多少代码来管理,O(∩_∩)O ...

  5. wsus安装与部署——下

    转载请注明原出处 write by xiaoyang 一.            测试 1.         使用客户机或者在域环境下编辑GPO打开组策略 2.         配置自动更新 3.   ...

  6. RAC监听与tns

    监听: 个人理解:本来想通过scan ip来配置tns总数报12545,后来通过vip来配置tns 11g rac的监听在安装时创建,由grid用户管理监听,listener.ora文件在$ORACL ...

  7. How Do I Declare A Block in Objective-C?

    As a local variable: returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...}; As a p ...

  8. 转载:简单介绍Python中的try和finally和with方法

    用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要 ...

  9. (转)RabbitMQ消息队列(二):”Hello, World“

    本文将使用Python(pika 0.9.8)实现从Producer到Consumer传递数据”Hello, World“. 首先复习一下上篇所学:RabbitMQ实现了AMQP定义的消息队列.它实现 ...

  10. vlan知识

    为什么需要VLAN 1. 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN ...