编辑和删除 ASP.NET 中的 sql 数据
Edit and Delete sql data in ASP.NET
我在 ASP.NET MVC 中编辑和删除 SQL 中的行时遇到了一些问题。我面临的主要问题是从我的控制器中的 url 获取 QueryString
值。
出于某种原因,我无法附加 Request.QueryString["Username"]
。它给我 Can not apply indexing with [] to an expression of type QueryString
错误。
我是不是做错了什么,或者有什么方法可以通过我的控制器将 QueryParameter
传递到我的数据访问层,它将在其中执行所需的查询。
我在 Edit
和 Delete
上遇到同样的问题
这是我的代码到目前为止的样子:
ShowUsers.cshtml(编辑和删除操作在这里挂钩)
@model IEnumerable<SecureMedi.Models.Users>
<section id="users">
<table id="users-table" class="table table-bordered table-responsive">
<thead>
<tr>
<th class="sort">Username</th>
<th class="sort">Role</th>
<th class="sort"><i class="md-icon dp18">mode_edit</i></th>
<th class="sort"><i class="md-icon dp18">delete</i></th>
</tr>
</thead>
<tbody class="list">
@foreach (var item in Model) {
<tr>
<td class="username">@item.Username</td>
<td class="role">@item.Role</td>
<td class="actions">@Html.ActionLink("Edit", "EditUser", "Home", new { Username = @item.Username }, null)</td>
<td class="actions">@Html.ActionLink("Delete", "DeleteUser", "Home", new { Username = @item.Username }, null)</td>
</tr>
}
</tbody>
</table>
</section>
EditUser.cshtml(用于编辑)- 注意:这里我还想默认显示 QueryString
中的 Username
值(Username=somename) 在页面加载时出现在表单中。从 ShowUsers
页面转到 EditUser
操作时,url
看起来像 /Home/EditUser?Username=somename
.
@model SecureMedi.Models.Users
<section id="edit-user">
<h4 class="sub-title space-top space-bottom">Edit user</h4>
<form id="edit-user-form" asp-controller="Home" asp-action="EditUser" method="post">
<div class="form-group">
<label asp-for="Username" class="form-control-label">Username</label>
<input asp-for="Username" type="text" class="form-control" id="username" name="Username" required disabled value="" />
</div><!-- / form-group -->
<div class="form-group">
<label asp-for="Role">Role</label>
<select asp-for="Role" class="form-control selector" id="role" name="Role" required>
<option value="" selected disabled>Select role</option>
<option value="SecureMediUsers">SecureMediUsers</option>
<option value="SecureMediModerators">SecureMediModerators</option>
<option value="SecureMediAdministrators">SecureMediAdministrators</option>
</select>
</div><!-- / form-group -->
<button type="submit" class="btn btn-primary">Save</button>
</form><!-- / form -->
</section>
HomeController.cs
[HttpGet]
public IActionResult EditUser() {
var model = new Users();
return View(model);
}
[HttpPost]
public IActionResult EditUser(Users u) {
if (!ModelState.IsValid) {
return View(u);
}
UsersDAL ud = new UsersDAL();
ud.Edit(u);
return RedirectToAction("ShowUsers");
}
[HttpPost]
public IActionResult DeleteUser(Users u) {
if (!ModelState.IsValid) {
return View(u);
}
UsersDAL ud = new UsersDAL();
ud.Delete(u);
return RedirectToAction("ShowUsers");
}
UsersDAL.cs(数据访问层)
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using SecureMedi.Models;
namespace SecureMedi.DAL {
public class UsersDAL {
public void Edit(Users u) {
string connectionstring = "MY_CONNECTION_STRING";
string sql = String.Format("ALTER ROLE {0} DROP MEMBER {1}", u.Role, u.Username);
string sql2 = String.Format("ALTER ROLE {0} ADD MEMBER {1}", u.Role, u.Username);
SqlConnection conn = new SqlConnection(connectionstring);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlCommand cmd2 = new SqlCommand(sql2, conn);
try {
conn.Open();
using(conn) {
cmd.Transaction = conn.BeginTransaction();
cmd.ExecuteNonQuery();
cmd2.Transaction = cmd.Transaction;
cmd2.ExecuteNonQuery();
cmd2.Transaction.Commit();
}
} finally {
if (conn != null) {
conn.Close();
}
}
}
public void Delete(Users u) {
string connectionstring = "MY_CONNECTION_STRING";
string sql = String.Format("DROP USER {0}", u.Username);
SqlConnection conn = new SqlConnection(connectionstring);
SqlCommand cmd = new SqlCommand(sql, conn);
try {
conn.Open();
using(conn) {
cmd.ExecuteNonQuery();
}
} finally {
if (conn != null) {
conn.Close();
}
}
}
}
}
Users.cs(型号)
using System.ComponentModel.DataAnnotations;
namespace SecureMedi.Models {
public class Users {
[Required]
[StringLength(100)]
public string Username {
get;
set;
}
[Required]
[StringLength(100)]
public string Role {
get;
set;
}
}
}
综上所述,我试图解决的问题是:
1) 将 EditUser
视图中的 Username
查询参数和表单中的 Role
值传递到我的 EditUser
控制器函数。
2) 我已经连接了
之类的删除操作
<td class="actions">@Html.ActionLink("Delete", "DeleteUser", "Home", new { Username = @item.Username }, null)</td>
但我对如何避免 [HttpGet]
for DeleteUser
操作感到困惑。当我单击锚标记时,它会将我带到 /Home/DeleteUser?Username=somename
,但我只想在不更改视图的情况下执行 DeleteUser
操作。
此外,如何将 Username
查询参数传递给控制器操作。
1) 更改 [HttpGet] EditUser
以采用 UserName
参数:
并通过 UserName
让用户将此数据发送到模型:
[HttpGet]
public IActionResult EditUser(string UserName) {
var model = new Users(UserName);//probably, Or something like GetUser(UserName)
return View(model);
}
2) 您不能使用actionLink 调用HTTPPost 方法。它将始终使用 HttpGet。因此,您可以使用两种方法 - 1. 在 HttpGet 中删除用户,然后重定向到上一页
2. 使用 JavaScript 调用 HttpPost,而不是通过点击操作 link 发送 HttpGet。
您只想删除记录表单数据库,只需单击删除 link 无需确认,用户应导航到同一页面。?
这些更改将为您完成这个技巧!尝试过
像这样更新您的家庭控制器:
我只是从 delete actionResult 中删除 [httppost] 并更改参数名称,还在您的 return redirecttoaction
中写入控制器名称
IMP 注意:将参数用户更新为用户名,无论你在哪里使用它,就像在 DAL 中一样。另外建议在任何地方都使用相同的用户名,否则它将为 null
HomeController.cs
[HttpGet]
public IActionResult EditUser() {
var model = new Users();
return View(model);
}
[HttpPost]
public IActionResult EditUser(Users u) {
if (!ModelState.IsValid) {
return View(u);
}
UsersDAL ud = new UsersDAL();
ud.Edit(u);
return RedirectToAction("ShowUsers", "ControllerName");
}
public IActionResult DeleteUser(Username u) {
if (!ModelState.IsValid) {
return View(u);
}
UsersDAL ud = new UsersDAL();
ud.Delete(u);
return RedirectToAction("ShowUsers", "ControllerName");
}
我在 ASP.NET MVC 中编辑和删除 SQL 中的行时遇到了一些问题。我面临的主要问题是从我的控制器中的 url 获取 QueryString
值。
出于某种原因,我无法附加 Request.QueryString["Username"]
。它给我 Can not apply indexing with [] to an expression of type QueryString
错误。
我是不是做错了什么,或者有什么方法可以通过我的控制器将 QueryParameter
传递到我的数据访问层,它将在其中执行所需的查询。
我在 Edit
和 Delete
这是我的代码到目前为止的样子:
ShowUsers.cshtml(编辑和删除操作在这里挂钩)
@model IEnumerable<SecureMedi.Models.Users>
<section id="users">
<table id="users-table" class="table table-bordered table-responsive">
<thead>
<tr>
<th class="sort">Username</th>
<th class="sort">Role</th>
<th class="sort"><i class="md-icon dp18">mode_edit</i></th>
<th class="sort"><i class="md-icon dp18">delete</i></th>
</tr>
</thead>
<tbody class="list">
@foreach (var item in Model) {
<tr>
<td class="username">@item.Username</td>
<td class="role">@item.Role</td>
<td class="actions">@Html.ActionLink("Edit", "EditUser", "Home", new { Username = @item.Username }, null)</td>
<td class="actions">@Html.ActionLink("Delete", "DeleteUser", "Home", new { Username = @item.Username }, null)</td>
</tr>
}
</tbody>
</table>
</section>
EditUser.cshtml(用于编辑)- 注意:这里我还想默认显示 QueryString
中的 Username
值(Username=somename) 在页面加载时出现在表单中。从 ShowUsers
页面转到 EditUser
操作时,url
看起来像 /Home/EditUser?Username=somename
.
@model SecureMedi.Models.Users
<section id="edit-user">
<h4 class="sub-title space-top space-bottom">Edit user</h4>
<form id="edit-user-form" asp-controller="Home" asp-action="EditUser" method="post">
<div class="form-group">
<label asp-for="Username" class="form-control-label">Username</label>
<input asp-for="Username" type="text" class="form-control" id="username" name="Username" required disabled value="" />
</div><!-- / form-group -->
<div class="form-group">
<label asp-for="Role">Role</label>
<select asp-for="Role" class="form-control selector" id="role" name="Role" required>
<option value="" selected disabled>Select role</option>
<option value="SecureMediUsers">SecureMediUsers</option>
<option value="SecureMediModerators">SecureMediModerators</option>
<option value="SecureMediAdministrators">SecureMediAdministrators</option>
</select>
</div><!-- / form-group -->
<button type="submit" class="btn btn-primary">Save</button>
</form><!-- / form -->
</section>
HomeController.cs
[HttpGet]
public IActionResult EditUser() {
var model = new Users();
return View(model);
}
[HttpPost]
public IActionResult EditUser(Users u) {
if (!ModelState.IsValid) {
return View(u);
}
UsersDAL ud = new UsersDAL();
ud.Edit(u);
return RedirectToAction("ShowUsers");
}
[HttpPost]
public IActionResult DeleteUser(Users u) {
if (!ModelState.IsValid) {
return View(u);
}
UsersDAL ud = new UsersDAL();
ud.Delete(u);
return RedirectToAction("ShowUsers");
}
UsersDAL.cs(数据访问层)
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using SecureMedi.Models;
namespace SecureMedi.DAL {
public class UsersDAL {
public void Edit(Users u) {
string connectionstring = "MY_CONNECTION_STRING";
string sql = String.Format("ALTER ROLE {0} DROP MEMBER {1}", u.Role, u.Username);
string sql2 = String.Format("ALTER ROLE {0} ADD MEMBER {1}", u.Role, u.Username);
SqlConnection conn = new SqlConnection(connectionstring);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlCommand cmd2 = new SqlCommand(sql2, conn);
try {
conn.Open();
using(conn) {
cmd.Transaction = conn.BeginTransaction();
cmd.ExecuteNonQuery();
cmd2.Transaction = cmd.Transaction;
cmd2.ExecuteNonQuery();
cmd2.Transaction.Commit();
}
} finally {
if (conn != null) {
conn.Close();
}
}
}
public void Delete(Users u) {
string connectionstring = "MY_CONNECTION_STRING";
string sql = String.Format("DROP USER {0}", u.Username);
SqlConnection conn = new SqlConnection(connectionstring);
SqlCommand cmd = new SqlCommand(sql, conn);
try {
conn.Open();
using(conn) {
cmd.ExecuteNonQuery();
}
} finally {
if (conn != null) {
conn.Close();
}
}
}
}
}
Users.cs(型号)
using System.ComponentModel.DataAnnotations;
namespace SecureMedi.Models {
public class Users {
[Required]
[StringLength(100)]
public string Username {
get;
set;
}
[Required]
[StringLength(100)]
public string Role {
get;
set;
}
}
}
综上所述,我试图解决的问题是:
1) 将 EditUser
视图中的 Username
查询参数和表单中的 Role
值传递到我的 EditUser
控制器函数。
2) 我已经连接了
之类的删除操作<td class="actions">@Html.ActionLink("Delete", "DeleteUser", "Home", new { Username = @item.Username }, null)</td>
但我对如何避免 [HttpGet]
for DeleteUser
操作感到困惑。当我单击锚标记时,它会将我带到 /Home/DeleteUser?Username=somename
,但我只想在不更改视图的情况下执行 DeleteUser
操作。
此外,如何将 Username
查询参数传递给控制器操作。
1) 更改 [HttpGet] EditUser
以采用 UserName
参数:
并通过 UserName
让用户将此数据发送到模型:
[HttpGet]
public IActionResult EditUser(string UserName) {
var model = new Users(UserName);//probably, Or something like GetUser(UserName)
return View(model);
}
2) 您不能使用actionLink 调用HTTPPost 方法。它将始终使用 HttpGet。因此,您可以使用两种方法 - 1. 在 HttpGet 中删除用户,然后重定向到上一页 2. 使用 JavaScript 调用 HttpPost,而不是通过点击操作 link 发送 HttpGet。
您只想删除记录表单数据库,只需单击删除 link 无需确认,用户应导航到同一页面。? 这些更改将为您完成这个技巧!尝试过
像这样更新您的家庭控制器: 我只是从 delete actionResult 中删除 [httppost] 并更改参数名称,还在您的 return redirecttoaction
中写入控制器名称IMP 注意:将参数用户更新为用户名,无论你在哪里使用它,就像在 DAL 中一样。另外建议在任何地方都使用相同的用户名,否则它将为 null
HomeController.cs
[HttpGet]
public IActionResult EditUser() {
var model = new Users();
return View(model);
}
[HttpPost]
public IActionResult EditUser(Users u) {
if (!ModelState.IsValid) {
return View(u);
}
UsersDAL ud = new UsersDAL();
ud.Edit(u);
return RedirectToAction("ShowUsers", "ControllerName");
}
public IActionResult DeleteUser(Username u) {
if (!ModelState.IsValid) {
return View(u);
}
UsersDAL ud = new UsersDAL();
ud.Delete(u);
return RedirectToAction("ShowUsers", "ControllerName");
}