//Index.cshtml

@model IQueryable<MvcExam2.Models.Product>
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        @Html.ActionLink("添加", "Add", "ProductCrud")
    </div>
    <div> 
        <table>
            <tr>
                <th>ModelNumber</th>
                <th>ModelName</th>
                <th>UnitCost</th>
                <th>修改</th>
                <th>删除</th>
            </tr>
            @foreach(MvcExam2.Models.Product p in Model)
            {
                <tr>
                    <td>@p.ModelNumber</td>
                    <td>@p.ModelName</td>
                    <td>@p.UnitCost</td>
                    <td>@Html.ActionLink("修改", "Update", "ProductCrud",new RouteValueDictionary(new { id = @p.ProductID }),null)</td>
                    <td>@Html.ActionLink("删除","Delete","ProductCrud", new RouteValueDictionary(new { id = @p.ProductID }), null)</td>
                </tr>
            }
        </table>
    </div>
</body>

</html>

//Add.cshtml

@model MvcExam2.Models.Product
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Add</title>
</head>
<body>
    <div> 
        @using (Html.BeginForm("Add", "ProductCrud", FormMethod.Post))
        {
            <span>ModelNumber:</span>@Html.TextBoxFor(p => p.ModelNumber);<br />
            <span>ModelName:</span>@Html.TextBoxFor(p => p.ModelName);<br />
            <span>UnitCost:</span>@Html.TextBoxFor(p=>p.UnitCost);<br />
            <input type="submit" name="name" value="submit" />
        }
    </div>
</body>

</html>

//Update.cshtml

@model MvcExam2.Models.Product
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Update</title>
</head>
<body>
    <div> 
        @using (Html.BeginForm("Update", "ProductCrud", FormMethod.Post))
        {
            @Html.HiddenFor(p=>p.ProductID)
            <span>ModelNumber:</span>@Html.TextBoxFor(p => p.ModelNumber) <br />
            <span>ModelName:</span>@Html.TextBoxFor(p => p.ModelName) <br />
            <span>UnitCost:</span>@Html.TextBoxFor(p => p.UnitCost) <br />
            <input type="submit" name="name" value="submit" />
        }
    </div>
</body>
</html>

//ProductCrudController

using MvcExam2.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.Entity.Migrations;

namespace MvcExam2.Controllers
{
    public class ProductCrudController : Controller
    {
        DbContext context = new StoreContext();
        // GET: ProductCrud
        public ActionResult Index()
        {
            IQueryable<Product> list = context.Set<Product>();
            return View(list);
        }

        public ActionResult Add()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Add(Product p)
        {
            p.CategoryID = 14;
            //第一种方法:用curd方法
            //context.Set<Product>().Add(p);
            
            //第二种方法:用状态跟踪
            context.Set<Product>().Attach(p);
            context.Entry(p).State = EntityState.Added;
            int result = context.SaveChanges();
            if (result>0)
            {
                return Redirect(Url.Action("Index"));
            }
            else
            {
                return Redirect(Url.Action("Error"));
            }
           
        }

        public ActionResult Update(int id)
        {
            ViewData.Model= context.Set<Product>().Where(p => p.ProductID == id).FirstOrDefault();
            return View();
        }

        [HttpPost]
        public ActionResult Update(Product p)
        {
            p.CategoryID = 14;
            //第一种方法:用curd方法
            // context.Set<Product>().AddOrUpdate(p);//需要引用System.Data.Entity.Migrations;

            //第二种方法:用状态跟踪
            context.Set<Product>().Attach(p);
            context.Entry(p).State = EntityState.Modified;
            int result = context.SaveChanges();
            if (result > 0)
            {
                return Redirect(Url.Action("Index"));
            }
            else
            {
                return Redirect(Url.Action("Error"));
            }
           
        }

        public ActionResult Delete(int id)
        {
           var product= context.Set<Product>().Where(p => p.ProductID == id).FirstOrDefault();
            //第一种方法:用curd方法
            //context.Set<Product>().Remove(obj);

            //第二种方法:用状态跟踪
            context.Set<Product>().Attach(product);
            context.Entry(product).State = EntityState.Deleted;
            int result = context.SaveChanges();
            if (result > 0)
            {
                return Redirect(Url.Action("Index"));
            }
            else
            {
                return Redirect(Url.Action("Error"));
            }
        }

        public ActionResult Error()
        {
            return View();
        }
    }
}

MVC CRUD 的两种方法的更多相关文章

  1. ASP.NET MVC 实现AJAX跨域请求的两种方法

    通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据的加载,例如Google. 在ASP.NET MVC 框 ...

  2. .NET MVC中登录过滤器拦截的两种方法

    今天给大家介绍两种ASP中过滤器拦截的两种方法. 一种是EF 的HtppModule,另一种则是灵活很多针对MVC的特性类 Attribute 具体什么是特性类可以参考着篇文章:https://www ...

  3. C# web api 返回类型设置为json的两种方法

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  4. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  5. android 之 启动画面的两种方法

    现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...

  6. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  7. php如何防止图片盗用/盗链的两种方法(转)

    图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量.本文章向大家介绍php防止图片盗用/盗链的两种方法 Apache图片重定向方法 设置images目录不充许http访问 Apache服 ...

  8. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  9. MongoDB实现分页(两种方法)

    1.插入实验数据 偷懒用下samus,100条. ; i < ; i++) { Document doc = new Document(); doc["ID"] = i; d ...

随机推荐

  1. RSA公钥验签

    1.业务场景,公司做理财业务,但是可能有第三方合作.与第三方合作获得更多客户流量.别人可以在第三方进行购买理财产品.那么怎么保证交易信息的安全性那,我们这里给出rsa加密实现原理. 2.工具类rsa: ...

  2. HBase总结(十一)hbase Java API 介绍及使用演示样例

    几个相关类与HBase数据模型之间的相应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) H ...

  3. [CSS] Nest a grid within a grid

    A grid item can also be a grid container! Let’s see how to specify a grid within a grid.

  4. 第二篇:_UICascadingTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds

    注意下文标红字段: #pragma mark- 输入改变时 - (void) textFieldDidChanged:(UITextField *) TextField{ //搜索关键字一旦改变,将重 ...

  5. Thrift写RPC接口

    Thrift总结(二)创建RPC服务 前面介绍了thrift 基础的东西,怎么写thrift 语法规范编写脚本,如何生成相关的语言的接口.不清楚的可以看这个<Thrift总结(一)介绍>. ...

  6. 学习OpenCV研究报告指出系列(二)源代码被编译并配有实例project

    下载并安装CMake3.0.1       要自己编译OpenCV2.4.9的源代码.首先.必须下载编译工具,使用的比較多的编译工具是CMake. 以下摘录一段关于CMake的介绍: CMake是一个 ...

  7. spring定时任务.线程池,自定义多线程配置

    定时任务及多线程配置xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  8. NET媒体文件操作组件TagLib

    开源的.NET媒体文件操作组件TagLib#解析   人生得意须尽欢 莫使金樽空对月.写博客都会在吃饭后,每次吃饭都要喝上二两小酒,写博客前都要闲扯,这些都是个人爱好,改不掉了,看不惯的人,还望多多包 ...

  9. 利用WPF建立自己的3d gis软件(非axhost方式)(八)拖动一个UI到地球上

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(八)拖动一个UI到地球上 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...

  10. Heterogeneous Self-Organizing Network for Access and Backhaul

    This application discloses methods for creating self-organizing networks implemented on heterogeneou ...