编辑和删除 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 传递到我的数据访问层,它将在其中执行所需的查询。

我在 EditDelete

上遇到同样的问题

这是我的代码到目前为止的样子:

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");
}