MVC新增数据

本文详细解析了在MVC框架中如何通过控制器接收并验证前端传来的数据,随后逐层保存至数据库的过程,涉及用户表、用户角色明细表及主表的新增操作。

在MVC当中新增数据,首先要做的是从页面的中传过来需要新增的内容,然后就是在控制器当中接收传过来的数据(参数),InsertEmployee是控制器的方法名称,后面括号的内容就是放的就是传过来的的数据(参数)。
ReturnJsonVo returnJson = new ReturnJsonVo()只是我用来记录新增的状态以及返回内容信息而已。
接下来就是必不可少的一步了,那就是判断上面传过来的内容是否为空(if(!string. . . .)),如果为空就返回一个内容为空,并且直接结束代码不再往下面执行。如果不为空,则开始查询出数据库中数据表的信息(int listEmployee=. . . .),并且判断新增的数据是否与数据库中的数据重复(if (listEmployee == 0)),重复则直接结束代码不再往下面执行。
在这里插入图片描述判断完之后就开始保存新增的数据,因为需要的新增的表格与其他表格存在联系,所以需要一张表一张表地保存,首先是新增用户表(PW_User),先声明一个表对象(PW_User dbUser = new PW_User()?,再给这个表对象的每个字段(dbUser.UserNuber=EmployeeNumber.Trim())赋值。
因为我在上面判断过如果保存的这条数据与数据库的数据则直接结束代码不再往下面执行,所以在这里不需要再次判断就可以给表对象的每个字段赋值。然后就是把新增的数据保存到数据库(myModels.PW_User.Add(dbUser)),(if(myModels.SaveChanges()>0))是判断新增是否成功,不成功则结束代码不再往下面执行。

用户表新增成功后就开始新增用户角色明细表(PW_UserRoleDetail),先获取上面新增成功的数据的主键(var UserID=dbUser.UserID),先声明一个表对象,再给这个表对象的每个字段赋值(pwUserRoleDetail.UserID = UserID),这张表格需要新增的就两个字段,给其中一个赋完值后,另一个字段的值默认设置为了5(pwUserRoleDetail.UserTypeID = 5),然后保存新增(myModels.PW_UserRoleDetail.Add(pwUserRoleDetail)), 判断新增是否成功,不成功则结束代码不再往下面执行。

最后就新增主表(PW_Employee),步骤不变先声明表对象,再给这个表对象的每个字段赋值(dbEmployee.UserID = UserID)UserID是上面获取到的用户表的主键,在这里作为这张表的外键新增到数据库,这张表的字段比较多,需要一个个地赋值(dbEmployee.UserID =. . . ), 然后保存新增(myModels.PW_Employee.Add(dbEmployee)), 判断新增是否成功,不成功则返回(returnJson.Text = “新增失败!”?,成功则把状态设置为true(returnJson.State = true),并且返回(returnJson.Text = “新增成功!”);
在这里插入图片描述在上面的代码当中判断了多少次,就得返回多少次(else{returnJson.Text = “”}),并且要注意( if 和else是成对出现的)一层一层的嵌套进去,这里的状态值(State)默认为false,所以不需要每个都设置,只需要在新增成功的时候把这里的状态值(State)设置为true就行了。
最后用一个Json对象(return Json(returnJson, JsonRequestBehavior.AllowGet))把上面的文本值(Text)和状态值(State)返回到页面。
在这里插入图片描述 新增其实就两句代码 myModels.(‘需要新增的表’).Add()和(myModels.SaveChanges()),其他的判断都是为这两句代码铺垫,还有就是这里因为要新增的主表与其他表格有相关的联系,所以需要新增多张表格,并且要注意新增的表格的顺序。

<think>我们正在使用C#的MVC框架创建一个新增页面。MVC模式将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。创建新增页面通常涉及以下步骤: 1. 创建模型(Model):定义要新增数据结构。 2. 创建视图(View):设计用户界面,供用户输入数据。 3. 创建控制器(Controller):处理用户提交的数据,进行验证和保存。 根据引用[1]和[2],新增页面的基本流程是:用户在视图页面输入数据,通过表单提交到控制器的某个动作方法,控制器处理数据(如检查重复等),然后保存到数据库。 下面我们逐步说明如何创建一个新增页面。 ### 步骤1:创建模型(Model) 假设我们要新增一个产品(Product),首先在Models文件夹下创建一个Product类。 ```csharp public class Product { public int Id { get; set; } [Required] public string Name { get; set; } public decimal Price { get; set; } // 其他属性... } ``` ### 步骤2:创建控制器(Controller) 在Controllers文件夹下创建控制器(如ProductsController),并添加两个动作方法:一个用于显示新增表单(GET),另一个用于处理表单提交(POST)。 ```csharp public class ProductsController : Controller { // 显示新增表单 public ActionResult Create() { return View(); } // 处理表单提交 [HttpPost] public ActionResult Create(Product product) { if (ModelState.IsValid) { // 检查重复(根据引用[1]) // 这里假设我们有一个数据库上下文_db,通过它来检查重复 if (_db.Products.Any(p => p.Name == product.Name)) { ModelState.AddModelError("Name", "产品名称已存在"); return View(product); } // 保存到数据库 _db.Products.Add(product); _db.SaveChanges(); // 保存成功后重定向,比如到列表页 return RedirectToAction("Index"); } return View(product); } } ``` ### 步骤3:创建视图(View) 在Views/Products文件夹下创建Create.cshtml视图文件。 ```html @model YourNamespace.Models.Product <h2>新增产品</h2> @using (Html.BeginForm("Create", "Products", FormMethod.Post)) { @Html.AntiForgeryToken() <div class="form-group"> @Html.LabelFor(model => model.Name) @Html.TextBoxFor(model => model.Name, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.Name) </div> <div class="form-group"> @Html.LabelFor(model => model.Price) @Html.TextBoxFor(model => model.Price, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.Price) </div> <button type="submit" class="btn btn-primary">提交</button> } ``` ### 步骤4:配置路由 通常,MVC框架默认的路由配置已经可以处理这样的URL:`/Products/Create`。 ### 步骤5:处理重复检查(参考引用[1]) 在控制器的POST方法中,我们检查了产品名称是否重复。如果重复,则向模型状态添加错误,并返回当前视图,显示错误信息。 ### 步骤6:前端验证(可选) 我们可以使用jQuery验证插件来增强前端验证,MVC默认的视图模板已经包含了这些脚本。 ### 注意事项 - 在保存之前,一定要进行模型状态验证(ModelState.IsValid)和业务规则验证(如重复检查)。 - 为了防止跨站请求伪造(CSRF)攻击,使用`@Html.AntiForgeryToken()`并在控制器方法上添加`[ValidateAntiForgeryToken]`属性(虽然示例中省略了,但建议加上)。 ### 引用说明 根据引用[1],新增数据时需要检查重复,我们在控制器中实现了这一逻辑。引用[2]展示了使用表单提交数据,以及使用Ajax提交的方式。如果需要使用Ajax提交,可以参考引用[2]中的JavaScript代码。 §§相关问题§§ 1. 在C# MVC中如何实现数据验证? 2. 如何使用Ajax提交表单而不刷新页面? 3. 在MVC中如何实现文件上传功能?</think>在 C# MVC 框架中创建新增页面需要遵循 MVC 模式(模型-视图-控制器),主要步骤如下: ### 步骤 1:创建模型(Model) 定义数据实体类,表示要新增数据结构: ```csharp // Models/Product.cs public class Product { public int Id { get; set; } [Required(ErrorMessage = "产品名称必填")] [StringLength(100)] public string Name { get; set; } [Range(0, 10000, ErrorMessage = "价格必须在0-10000之间")] public decimal Price { get; set; } public DateTime CreateTime { get; set; } = DateTime.Now; } ``` ### 步骤 2:创建控制器(Controller) 添加处理新增逻辑的控制器方法: ```csharp // Controllers/ProductController.cs public class ProductController : Controller { private readonly AppDbContext _db; // 数据库上下文 // GET: 显示新增表单 public ActionResult Create() { return View(); // 返回空表单视图 } // POST: 处理表单提交 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(Product product) { if (ModelState.IsValid) { // 检查重复(参考引用[1]) if (!_db.Products.Any(p => p.Name == product.Name)) { _db.Products.Add(product); _db.SaveChanges(); return RedirectToAction("Index"); // 成功跳转到列表页 } ModelState.AddModelError("", "产品名称已存在"); } return View(product); // 验证失败返回表单 } } ``` ### 步骤 3:创建视图(View) 在 `Views/Product/Create.cshtml` 中创建表单: ```html @model YourProject.Models.Product <h2>新增产品</h2> @using (Html.BeginForm("Create", "Product", FormMethod.Post)) { @Html.AntiForgeryToken() <div class="form-group"> @Html.LabelFor(m => m.Name) @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Name) </div> <div class="form-group"> @Html.LabelFor(m => m.Price) @Html.TextBoxFor(m => m.Price, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Price) </div> <button type="submit" class="btn btn-primary">保存</button> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) } ``` ### 关键实现说明 1. **重复检查**:在控制器中通过 `Any()` 方法检查数据是否重复(参考引用[1]) 2. **表单验证**: - 使用 `[Required]`、`[Range]` 等数据注解 - 前端通过 `@Html.ValidationMessageFor` 显示错误信息 3. **安全机制**: - `[ValidateAntiForgeryToken]` 防止 CSRF 攻击 - `@Html.AntiForgeryToken()` 生成令牌 4. **数据保存**: - 通过 Entity Framework 的 `Add()` 和 `SaveChanges()` 保存数据 - 成功后重定向防止重复提交 ### 多模块扩展建议(参考引用[4][5]) 对于大型项目: 1. 将业务逻辑封装在服务层(Service Layer) 2. 使用接口隔离实现(如 `IProductService`) 3. 通过依赖注入注册服务: ```csharp // Startup.cs services.AddScoped<IProductService, ProductService>(); ``` ### 前端交互优化(参考引用[2]) 如需使用 AJAX 提交: ```javascript function saveProduct() { $.ajax({ url: '/Product/Create', type: 'POST', data: $('#productForm').serialize(), success: function(response) { if(response.success) { alert("新增成功!"); } } }); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值