Asp.Net MVC +EntityFramework主从表新增编辑操作的实现

对于MVC中同时对主从表的表单操作在网上现有的解决很少,而这样的操作在做业务系统中是经常为遇到的。我在网上搜索了很久都没有发现很完整的实例或非常好的解决方案,所以我很想和大家讨论一下又什么更好的解决方案。

一旦有更好的方式我会把它集成到模板中实现自动生成。所以很希望得到大家的帮助。在这里我先抛砖引玉了。

Demo代码在 https://github.com/neozhu/MVC5-Scaffolder 下载

先看一下我的Demo实例

实体类的结构

实现的操作界面如下图

功能:

查询页面上可以单击新增和编辑进行对数据维护

页面的结构是上部是维护表头,下部的Table是现实子表数据,对子表数据的维护使用bootstrap popup modal的方式操作。

具体实现

View层的代码

Index :查询Table List

Create :新增页面

Edit : 编辑页面

EditForm :Partial View内嵌在Create 和Edit页面中

_OrderDetailForm : pupup 子表维护表单页面

Create,和Edit页面通过Ajax Post 把数据提交到后台的Controller进行操作

代码如下

<script type="text/javascript">

var $orderdetailstable = {};

var ObjectState = "Added";

$(document).ready(function () {

$('#orders').submit(function () {

var actionurl = $(this).attr('action');

var orderdetails = $orderdetailstable.bootstrapTable('getData');

console.log(orderdetails);

var newitem = {

Id:0,

Customer: $('#Customer','#orders').val(),

ShippingAddress: $('#ShippingAddress', '#orders').val(),

OrderDate: $('#OrderDate', '#orders').val(),

ObjectState:ObjectState,

OrderDetails: orderdetails

};

console.log(newitem);

$.ajax({

url: actionurl,

type: "POST",

dataType: "json",

contentType: "application/json; charset=utf-8",

data: JSON.stringify(newitem),

success: function (result) {

self.location = "/Orders/Index";

//alert("success " + result.UserName);

},

error: function (result) {

alert("Failed");

}

});

return false;

});

});

</script>

  

通过Jquery 获取表头和表体数据 序列化成Json对象然后Post到后台

这里有个问题关于Josn 序列化的 所有的实体 Order都集成Entity这个基类,Entity有个枚举类型的字段 [ObjectState] 用了好多方法都没有办法把这个字段提交到后台,在Controller的Create,Edit 方法中的Order就是没有[ObjectState]这个字段的值;所以在Controller层还得写很多代码来修改实体状态

Controller层代码

这里就只贴Create方法的代码

// GET: Orders/Create

public ActionResult Create()

{

         //Detail Models RelatedProperties

            var orderRepository = _unitOfWork.Repository<Order>();

ViewBag.OrderId = new SelectList(orderRepository.Queryable(), "Id", "Customer");

            var productRepository = _unitOfWork.Repository<Product>();

ViewBag.ProductId = new SelectList(productRepository.Queryable(), "Id", "Name");

return View();

}

// POST: Orders/Create

// To protect from overposting attacks, please enable the specific properties you want to bind to, for more details see http://go.microsoft.com/fwlink/?LinkId=317598.

[HttpPost]

//[ValidateAntiForgeryToken]

public ActionResult Create([Bind(Include = "OrderDetails,Id,Customer,ShippingAddress,OrderDate")] Order order)

{

if (ModelState.IsValid)

{

order.ObjectState = ObjectState.Added;

foreach (var detail in order.OrderDetails)

{

detail.ObjectState = ObjectState.Added;

if (detail.Product != null)

detail.Product.ObjectState = ObjectState.Detached;

}

_orderService.InsertOrUpdateGraph(order);

_unitOfWork.SaveChanges();

DisplaySuccessMessage("Has append a Order record");

//return RedirectToAction("Index");

return Json("{Status:Success}", JsonRequestBehavior.AllowGet);

}

DisplayErrorMessage();

return View(order);

}

  

因为没办法在前端把[ObjectState]这个字段的值序列化所以写了一个foreach来修改状态,不知道你们有没有什么好的解决方案

Popup Modal编辑子表数据代码

新增表体按钮

$('#neworderdetailbutton').on('click', function (e) {

if ($("form").valid()) {

var url="/Orders/CreateOrderDetail"

$.get(url , function (data) {

//console.log(data);

var index=-1;

$('#orderdetailformModal-body').html(data);

$('#rowindex').val(index);

$('#Id').val(0);

$('#orderdetailformModal').modal('toggle');

});

}

e.preventDefault();

//Return false regardless of validation to stop form submitting

//prior to ajax doing its thing

return false;

})

  

OrderController 添加一个新增表体和修改表体的Action用于生产对应的Partial View

我在这里也试过在OrderController中不添加对子表操作的Action,完全使用JS完成对行的操作,但在对编辑现有表体数据时出现了问题。后来注销掉了@*@Html.Partial("_OrderDetailForm")*@

现在还有非常棘手的问题就是如何进行删除操作,一旦在编辑状态下,把其中一个表体的记录删掉,删除后就没办法把数据提交到后台,而不删添加一个删除标志,这同样也会带来很多操作,如Table 在laod数据时还要把带删除标志的行筛选掉,又要添加好多代码

不知道你们是否有很好的解决方案

Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)的更多相关文章

  1. ASP.NET MVC 3 之表单和 HTML 辅助方法(摘抄)

    ——选自<ASP.NET MVC3 高级编程(第5章) 孙远帅 译> 第5章 表单和HTML辅助方法 本章内容简介: * 理解表单 * 如何利用HTML辅助方法 * 编辑和输入的辅助方法 ...

  2. 使用asp.net mvc + entityframework + sqlServer 搭建一个简单的code first项目

    步骤: 1. 创建一个asp.net mvc 项目 1.1 项目创建好结构如下 2 通过vs安装EntityFramework框架 install-package entityframework 3. ...

  3. ASP.NET MVC Jquery Validate 表单验证的多种方式

    在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...

  4. Ubuntu 环境 运行Asp.net mvc +EntityFramework+ Mysql

    关键词:ubuntu,mono,.Net framework 4.5,asp.net mvc 4,Entityframework 6,Mysql Mono安装 参考文章: Install Mono o ...

  5. [转]ASP.NET MVC Jquery Validate 表单验证的多种方式介绍

    在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...

  6. asp.net mvc entityframework sql server 迁移至 mysql方法以及遇到的问题

    背景: 我原来的项目是asp.net mvc5 + entityframework 6.4 for sql server(localdb,sql server),现在需要把数据库切换成mysql,理论 ...

  7. ASP.NET MVC 学习1、新增Controller,了解MVC运行机制

    1,turorial ,根据链接教程新建一个MVC项目 http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/ ...

  8. ASP入门(二十三)- 数据库插入、更新和删除操作

    我们这里介绍如何使用 Recordset 对象进行插入.更新和删除操作,顺便和 SQL 语句对比. 插入记录 AddNew 方法用于插入一条记录,首先打开一个记录集,并且这个记录具备可写特性,而后调用 ...

  9. React---简单实现表单点击提交插入、删除操作

    import React,{Component,Fragment} from 'react' class App extends Component { constructor(){ super() ...

随机推荐

  1. ajax的另一种成功和失败回调函数

    第一种: function engline(){ var oldmsg = $('#lineso').val() if(oldmsg == null || oldmsg == '' || oldmsg ...

  2. spring rabbitmq集成

    pom.xml加 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-clien ...

  3. flask通过form表单一次上传多个文件

    基本上,用了flask官网的示例代码(中文版,英文版),稍微做了修改. import os from flask import Flask, flash, request, redirect, url ...

  4. VBA找相似体积的单元格值

    在VBA中做了一个比较体积,如果体积相似就显示隔壁单元格的内容 Function VC(a, b As Range) 'VolumeCompare体积比较 Dim arry() As Variant ...

  5. SpringMVC学习 十三 拦截器栈

    拦截器栈:就是有多个拦截器同时拦截相同的控制器(controller)请求,这写拦截器就构成了拦截器栈. 栈的特点是先进后出,在拦截器栈中也是如此,如果先执行了preHandle方法,也就是意味着先进 ...

  6. Codeforces Round #547 (Div. 3) F 贪心 + 离散化

    https://codeforces.com/contest/1141/problem/F2 题意 一个大小为n的数组a[],问最多有多少个不相交的区间和相等 题解 离散化用值来做,贪心选择较前的区间 ...

  7. Linux下强制杀死进程的方法

    常规篇: 首先,用ps查看进程,方法如下: $ ps -ef …… smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal smx 1823 1822 0 11:38 ...

  8. 第40章:MongoDB-集群--Replica Sets(副本集)---副本集的管理

    ①以单机模式启动成员 由于很多维护的工作需要写入操作,所以不合适在副本集中操作,可以以单机模式启动成员,也就是不要使用副本的选项,就跟以前启动单独的服务器一样.一般使用一个跟副本集配置中不一样的端口号 ...

  9. 配置微信jssdk自定义分享

    前段时间做这个功能的时候遇到这个问题,之前的话是微信自动抓取界面第一张图,现在微信更新api,必须自行配置,接入jssdk,才能实现该功能. 详细可以查看微信的jssdk文档 微信官方开发者文档    ...

  10. AFNetworking 3.0中调用[AFHTTPSessionManager manager]方法导致内存泄漏的解决办法

    在使用AFNetworking3.0框架,使用Instruments检查Leaks时,检测到1000多个内存泄漏的地方,定位到 [AFHTTPSessionManager manager] 语句中,几 ...