编辑多条记录 - asp.net MVC
Edit multiple records - asp.net MVC
几天来我一直在为这个问题苦思冥想,似乎无法弄清楚或找不到一篇文章来回答我的问题。
我正在开发一个轮班系统,几乎完成了,但我在管理区域停留在这部分。
它将允许管理层为给定团队编辑给定日期范围内的多个轮值表条目。
它最终会使用一个视图模型来传递 dateFrom、dateTo 和 Team (teamID) - 我现在只是用这种方式来尝试让它工作。
rotas 存储在 Rotas table 中(见下文。)
Rotas table
MorningShift 和 EveningShift(都是 FK)存储员工的工资单号,例如123456.
员工详细信息存储在 TeamMembers table 中(见下文。)
TeamMembers table
TeamMembers 中的用户名table 是员工的工资单号。
我的问题是,我似乎无法让当前在列表 table 中输入的值显示在视图的下拉列表中。它只为所有下拉列表显示 select 列表 (Model.TeamMembers) 中的第一位员工。
我的问题是,如何让当前值显示在视图的每个下拉列表中?
我试过了
@Html.DropDownListFor(m => m.Rotas[i].MorningShift, Model.TeamMembers,
Model.Rotas[i].TeamMember1.FirstName + " " + Model.Rotas[i].TeamMember1.Surname, null)
但是虽然这显示了正确的员工,但它没有为该选项设置值,并且显然再次显示了员工的姓名,因为它在 select 列表中。
我目前拥有的:
控制器:
public async Task<ActionResult> ModifyRotas(DateTime? dateFrom,
DateTime? dateTo, int? Team)
{
Auth auth = new Auth();
bool isAdmin = auth.IsAdmin();
if (!isAdmin)
{
return new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
}
if (dateFrom != null && dateTo != null)
{
DateTime today = DateTime.Today;
DateTime startDate = Convert.ToDateTime(dateFrom);
DateTime endDate = Convert.ToDateTime(dateTo);
// Make sure earlier shifts can't be modified
if (startDate < today)
{
startDate = today;
}
// Verify the team exists
Team teamDetails = await db.Teams.FindAsync(Team);
if (teamDetails == null)
{
return HttpNotFound();
}
ModifyRotaVM vm = new ModifyRotaVM();
// Get rotas for the team for the dates specified
var rotas = await db.Rotas.Where(r => r.TeamID == Team && (r.ShiftDate >= startDate && r.ShiftDate <= endDate)).ToListAsync();
vm.Rotas = rotas;
// Generate the dropdown lists
var teamMembers = db.TeamMembers.Where(m => m.TeamID == Team && m.Deleted == 0).Select(m => new SelectListItem() { Text = m.FirstName + " " + m.Surname, Value = m.Username });
ViewBag.MorningShift = teamMembers;
ViewBag.EveningShift = teamMembers;
vm.TeamMembers = teamMembers;
return View(vm);
}
// If we got here, something went wrong; redisplay the form
return RedirectToAction("Modify");
}
虚拟机:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace TeamRota.Models
{
public class ModifyRotaVM
{
public List<Rota> Rotas { get; set; }
public IEnumerable<SelectListItem> TeamMembers { get; set; }
}
}
观点:
@model TeamRota.Models.ModifyRotaVM
@{
ViewBag.Title = "ModifyRotas";
}
<h2>Modify Rotas</h2>
@using (Html.BeginForm("RotaMod", "Rotas", new { area = "Admin" },
FormMethod.Post))
{
// Being passed in so we can redirect back to the same page after the update
@Html.Hidden("startDate", Request.QueryString["dateFrom"])
@Html.Hidden("endDate", Request.QueryString["dateFrom"])
@Html.Hidden("TeamID", Request.QueryString["Team"])
<table width="100%">
<tr>
<td>Shift date</td>
<td>Morning shift</td>
<td>Evening shift</td>
</tr>
@for (int i = 0; i < Model.Rotas.Count(); i++)
{
<tr>
<td>
@Html.HiddenFor(m => m.Rotas[i].ID)
@Html.DisplayFor(m => m.Rotas[i].ShiftDate)
</td>
<td>@Html.DropDownListFor(m => m.Rotas[i].MorningShift, Model.TeamMembers, Model.Rotas[i].TeamMember1.FirstName + " " + Model.Rotas[i].TeamMember1.Surname, null)</td>
<td>@Html.DropDownListFor(m => m.Rotas[i].EveningShift, Model.TeamMembers, Model.Rotas[i].TeamMember.FirstName + " " + Model.Rotas[i].TeamMember.Surname, null)</td>
</tr>
}
<tr>
<td colspan="4"><input type="submit" class="btn btn-success" value="Update" /></td>
</tr>
</table>
}
非常感谢任何人可以提供的任何帮助。
谢谢。
汤姆
我认为您应该尝试为 DropDownListFor 重新创建 SelectList。
var teamMembers = db.TeamMembers.Where(m => m.TeamID == Team && m.Deleted == 0).Select(m => new { Text = m.FirstName + " " + m.Surname, Value = m.Username });
ViewBag.TeamMembers = teamMembers
那么在你看来,你只需要这样做:
@Html.DropDownListFor(m => m.Rotas[i].MorningShift, new SelectList(ViewBag.TeamMembers, "Value", "Text", Model.Rotas[i].TeamMember1.Username), null)
@Html.DropDownListFor(m => m.Rotas[i].EveningShift, new SelectList(ViewBag.TeamMembers, "Value", "Text", Model.Rotas[i].TeamMember.Username), null)
几天来我一直在为这个问题苦思冥想,似乎无法弄清楚或找不到一篇文章来回答我的问题。
我正在开发一个轮班系统,几乎完成了,但我在管理区域停留在这部分。 它将允许管理层为给定团队编辑给定日期范围内的多个轮值表条目。 它最终会使用一个视图模型来传递 dateFrom、dateTo 和 Team (teamID) - 我现在只是用这种方式来尝试让它工作。
rotas 存储在 Rotas table 中(见下文。) Rotas table
MorningShift 和 EveningShift(都是 FK)存储员工的工资单号,例如123456.
员工详细信息存储在 TeamMembers table 中(见下文。) TeamMembers table
TeamMembers 中的用户名table 是员工的工资单号。
我的问题是,我似乎无法让当前在列表 table 中输入的值显示在视图的下拉列表中。它只为所有下拉列表显示 select 列表 (Model.TeamMembers) 中的第一位员工。 我的问题是,如何让当前值显示在视图的每个下拉列表中? 我试过了
@Html.DropDownListFor(m => m.Rotas[i].MorningShift, Model.TeamMembers,
Model.Rotas[i].TeamMember1.FirstName + " " + Model.Rotas[i].TeamMember1.Surname, null)
但是虽然这显示了正确的员工,但它没有为该选项设置值,并且显然再次显示了员工的姓名,因为它在 select 列表中。
我目前拥有的:
控制器:
public async Task<ActionResult> ModifyRotas(DateTime? dateFrom,
DateTime? dateTo, int? Team)
{
Auth auth = new Auth();
bool isAdmin = auth.IsAdmin();
if (!isAdmin)
{
return new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
}
if (dateFrom != null && dateTo != null)
{
DateTime today = DateTime.Today;
DateTime startDate = Convert.ToDateTime(dateFrom);
DateTime endDate = Convert.ToDateTime(dateTo);
// Make sure earlier shifts can't be modified
if (startDate < today)
{
startDate = today;
}
// Verify the team exists
Team teamDetails = await db.Teams.FindAsync(Team);
if (teamDetails == null)
{
return HttpNotFound();
}
ModifyRotaVM vm = new ModifyRotaVM();
// Get rotas for the team for the dates specified
var rotas = await db.Rotas.Where(r => r.TeamID == Team && (r.ShiftDate >= startDate && r.ShiftDate <= endDate)).ToListAsync();
vm.Rotas = rotas;
// Generate the dropdown lists
var teamMembers = db.TeamMembers.Where(m => m.TeamID == Team && m.Deleted == 0).Select(m => new SelectListItem() { Text = m.FirstName + " " + m.Surname, Value = m.Username });
ViewBag.MorningShift = teamMembers;
ViewBag.EveningShift = teamMembers;
vm.TeamMembers = teamMembers;
return View(vm);
}
// If we got here, something went wrong; redisplay the form
return RedirectToAction("Modify");
}
虚拟机:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace TeamRota.Models
{
public class ModifyRotaVM
{
public List<Rota> Rotas { get; set; }
public IEnumerable<SelectListItem> TeamMembers { get; set; }
}
}
观点:
@model TeamRota.Models.ModifyRotaVM
@{
ViewBag.Title = "ModifyRotas";
}
<h2>Modify Rotas</h2>
@using (Html.BeginForm("RotaMod", "Rotas", new { area = "Admin" },
FormMethod.Post))
{
// Being passed in so we can redirect back to the same page after the update
@Html.Hidden("startDate", Request.QueryString["dateFrom"])
@Html.Hidden("endDate", Request.QueryString["dateFrom"])
@Html.Hidden("TeamID", Request.QueryString["Team"])
<table width="100%">
<tr>
<td>Shift date</td>
<td>Morning shift</td>
<td>Evening shift</td>
</tr>
@for (int i = 0; i < Model.Rotas.Count(); i++)
{
<tr>
<td>
@Html.HiddenFor(m => m.Rotas[i].ID)
@Html.DisplayFor(m => m.Rotas[i].ShiftDate)
</td>
<td>@Html.DropDownListFor(m => m.Rotas[i].MorningShift, Model.TeamMembers, Model.Rotas[i].TeamMember1.FirstName + " " + Model.Rotas[i].TeamMember1.Surname, null)</td>
<td>@Html.DropDownListFor(m => m.Rotas[i].EveningShift, Model.TeamMembers, Model.Rotas[i].TeamMember.FirstName + " " + Model.Rotas[i].TeamMember.Surname, null)</td>
</tr>
}
<tr>
<td colspan="4"><input type="submit" class="btn btn-success" value="Update" /></td>
</tr>
</table>
}
非常感谢任何人可以提供的任何帮助。
谢谢。
汤姆
我认为您应该尝试为 DropDownListFor 重新创建 SelectList。
var teamMembers = db.TeamMembers.Where(m => m.TeamID == Team && m.Deleted == 0).Select(m => new { Text = m.FirstName + " " + m.Surname, Value = m.Username });
ViewBag.TeamMembers = teamMembers
那么在你看来,你只需要这样做:
@Html.DropDownListFor(m => m.Rotas[i].MorningShift, new SelectList(ViewBag.TeamMembers, "Value", "Text", Model.Rotas[i].TeamMember1.Username), null)
@Html.DropDownListFor(m => m.Rotas[i].EveningShift, new SelectList(ViewBag.TeamMembers, "Value", "Text", Model.Rotas[i].TeamMember.Username), null)