c# - 当您在asp net core mvc中有多合一列表时如何将特定用户添加到表中
问题描述
我在一个视图中有两个提交按钮
第一个在 Active Directory 中搜索用户
第二个将选定的用户添加到表中AspNetUsers
我在按钮属性 asp-route-id 中指定了用户名,即员工 ID,以便我可以从单击搜索按钮后出现的用户列表中添加该特定用户。但问题是它添加了列表中的第一个人。它没有添加我点击的那个。
This is my controller
[AcceptVerbs("Get", "Post")]
public async Task<IActionResult> AddUser(SearchViewModel profile , string button, List<User> users )
{
if (button == "Search")
{
if (ModelState.IsValid)
{
users = new List<User>();
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "mydomain.com"))
{
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.DisplayName = profile.Name + "*";
using (PrincipalSearcher srch = new PrincipalSearcher(qbeUser))
{
if (!string.IsNullOrEmpty(srch.FindAll().ToString()))
{
foreach (var found in srch.FindAll())
{
if (found != null)
{
users.Add(new User()
{
Name = found.Name,
Email = found.UserPrincipalName,
SatffID = found.SamAccountName
});
}
else
{
return View();
}
}
SearchViewModel returnmodel = new SearchViewModel(users);
return View(returnmodel);
}
}
}
}
}
if(button=="Add")
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = profile.ID, Email = profile.Email, DisplayName = profile.DisplayName };
var result = await userManager.CreateAsync(user);
if (result.Succeeded)
{
if(profile.Location !=null)
{
for (int i = 0; i < profile.Location.Count; i++)
{
var newUser = await userManager.FindByNameAsync(profile.ID);
var userId = newUser.Id;
//var newUser = profile.ID;
UserLocation userLoc = new UserLocation
{
UserID = userId.ToString(),
LocID = profile.Location[i]
};
userLocation.Add(userLoc);
}
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError(string.Empty, "No locs");
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
ModelState.AddModelError(string.Empty, "");
}
return View(profile);
}
return View(profile);
}
This is my View AddUser
@model SearchViewModel
<h1>Add New User</h1>
@Html.ValidationSummary(true)
<form method="post" formaction="">
<div id="content">
<fieldset>
<div class="form-group col-md-12">
@Html.LabelFor(model => Model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-4">
@Html.EditorFor(modelItem => Model.Name, new { htmlAttributes = new { @class = "form-control", @style = "width:280px" }, })
</div>
<div>
<div class="form-group row">
<label asp-for="@Model.Location" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<select asp-for="@Model.Location" asp-items="Html.GetEnumSelectList<Location>()" class="custom-select mr-sm-2" id="Subjects_dropdown" multiple>
<option value="">Please Select</option>
</select>
<span asp-validation-for="@Model.Location" class="text-danger"></span>
</div>
</div>
</div>
<div class="col-md-2">
<input type="submit" class="btn btn-default" name="button" value="Search">
</div>
<div class="col-md-3">
</div>
</div>
</fieldset>
<br>
</div>
<table id="historyTable" class="table">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Staff Id</th>
<th>Add User</th>
</tr>
</thead>
<tbody>
@if (Model.FoundUsers != null)
{
@foreach (var user in Model.FoundUsers)
{
if (user != null)
{
<tr>
<td><label asp-for="DisplayName"></label><input asp-for="DisplayName" value="@user.Name" name="displayname" /></td>
<td><label asp-for="Email"></label><input asp-for="Email" value="@user.Email" name="Email" /></td>
<td><label asp-for="ID"></label><input asp-for="ID" value="@user.SatffID" name="ID" /></td>
<td><input type="submit" class="btn btn-primary" name="button" value="Add" asp-route-Id="@user.SatffID" asp-action="AddUser"></td>
</tr>
}
}
}
else
{
<tr>
<td colspan="4">No Record Available</td>
</tr>
}
</tbody>
</table>
</form>
}
@section Scripts{
<script>
$(document).ready(function () {
$('#Subjects_dropdown').multiselect();
});
</script>
}
解决方案
我尝试在我身边重现您的问题,我发现如果我单击添加按钮,请求包含所有行数据,如下面的屏幕截图:
所以我认为问题来自表单提交,我尝试为每一行添加表单,并且它有效。
这是我的代码片段,只是添加@using (Html.BeginForm())
内容。</p>
这里有一个和你类似的问题,你也可以参考它编写js脚本来实现它。
我的控制器动作:
[AcceptVerbs("Get", "Post")]
public IActionResult AddUser(SearchViewModel profile, string button, List<User> users)
{
ViewData["Location"] = new List<string> {
"location_a",
"location_b"
};
if (button == "Search")
{
if (ModelState.IsValid)
{
users = new List<User>();
users.Add(new User()
{
Name = "name_a",
Email = "email_a",
SatffID = "staff_a"
});
users.Add(
new User()
{
Name = "name_b",
Email = "email_b",
SatffID = "staff_b"
});
users.Add(
new User()
{
Name = "name_c",
Email = "email_c",
SatffID = "staff_c"
});
SearchViewModel returnmodel = new SearchViewModel();
returnmodel.FoundUsers = users;
return View(returnmodel);
}
}
if (button == "Add")
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = profile.ID, Email = profile.Email, DisplayName = profile.DisplayName };
//save data
return RedirectToAction("Index", "Home");
}
return View(profile);
}
return View(profile);
}
查看代码:
@model SearchViewModel
<h1>Add New User</h1>
@Html.ValidationSummary(true)
<form method="post" formaction="">
<div id="content">
<fieldset>
<div class="form-group col-md-12">
@Html.LabelFor(model => Model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-4">
@Html.EditorFor(modelItem => Model.Name, new { htmlAttributes = new { @class = "form-control", @style = "width:280px" }, })
</div>
<div>
<div class="form-group row">
<label asp-for="@Model.Location" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<select asp-for="@Model.Location" asp-items="(@ViewData["Location"] as IEnumerable<SelectListItem>)" class="custom-select mr-sm-2" id="Subjects_dropdown" multiple>
<option value="">Please Select</option>
</select>
<span asp-validation-for="@Model.Location" class="text-danger"></span>
</div>
</div>
</div>
<div class="col-md-2">
<input type="submit" class="btn btn-default" name="button" value="Search">
</div>
<div class="col-md-3">
</div>
</div>
</fieldset>
<br>
</div>
<table id="historyTable" class="table">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Staff Id</th>
<th>Add User</th>
</tr>
</thead>
<tbody>
@if (Model.FoundUsers != null)
{
@foreach (var user in Model.FoundUsers)
{
if (user != null)
{
<tr>
@using (Html.BeginForm())
{
<td><label asp-for="DisplayName"></label><input asp-for="DisplayName" value="@user.Name" name="displayname" /></td>
<td><label asp-for="Email"></label><input asp-for="Email" value="@user.Email" name="Email" /></td>
<td><label asp-for="ID"></label><input asp-for="ID" value="@user.SatffID" name="ID" /></td>
<td><input type="submit" class="btn btn-primary" name="button" value="Add" asp-route-Id="@user.SatffID" asp-action="AddUser"></td>
}
</tr>
}
}
}
else
{
<tr>
<td colspan="4">No Record Available</td>
</tr>
}
</tbody>
</table>
</form>
@section Scripts{
<script>
$(document).ready(function () {
$('#Subjects_dropdown').multiselect();
});
</script>
}
这是我只添加的相关代码
推荐阅读
- c# - 在 SelectedCellsChanged 事件中获取当前单元格和下一个单元格的值
- codeigniter-3 - Codeigniter 404 Page Not Found in route with two folder
- php - ModSecurity:使用代码 403 拒绝访问(第 2 阶段)
- spring - Spring 5 JMS clientID=myapp.Topic 已设置为另一个连接
- perl - Net::SSH2::Simple 更新到 Windows10 后失败
- reactjs - mobx-react-lite 是大型 React 应用程序状态管理的好选择吗?
- c++ - 检测 OpenCV C++ 窗口上的触摸
- python - VS Code Python 交互式窗口 ImportError:无法导入名称
- javascript - 如何让一个方法等待另一个方法完成?
- html - istyle 属性有什么作用以及可用的值是什么?