【发布时间】:2020-01-07 15:33:24
【问题描述】:
在这里我可以在创建页面上绑定多选列表。
<select id="multiple" asp-for="SecurityLog.Officer" multiple="multiple" class="selectpicker form-control" asp-items="ViewBag.Officer">
</select>
public IActionResult OnGetAsync()
{
ViewData["Officer"] = new SelectList(_context.Officer.Where(a => a.Active == "Y"), "ID", "FullName");
return Page();
}
我遇到的最大问题是我正在尝试编辑/发布值,并且在我的模型中没有直接绑定到的字段。
我在这里找到了一个很好的例子,但它只向您展示了如何保存 1 个选择。 https://www.learnrazorpages.com/razor-pages/forms/select-lists
我的 SecurityLog 模型有这个
public virtual Officer Officer { get; set; }
我的军官模型有这个
namespace SecurityCore.Models
{
public class Officer
{
[Required]
public int ID { get; set; }
[Required]
[Display(Name = "Officer's First Name")]
public string FirstName { get; set; }
[Required]
[Display(Name = "Officer's Last Name")]
public string LastName { get; set; }
[Display(Name = "Officer's Name")]
public string FullName { get; set; }
[Required]
public string Active { get; set; }
}
}
我没有 SecurityLogOfficer 模型。我需要一个吗?
这是我的数据库架构和示例结果
任何帮助将不胜感激!
* 更新 *
感谢您建议绑定到列表并将 asp-for 更改为该列表。这是我更新的代码。 SelectedOfficerIds 确实存储了选定的 id。
<select id="multiple" asp-for="SelectedOfficerIds" multiple="multiple" class="selectpicker form-control" asp-items="ViewBag.Officer">
</select>
我要发布到两个不同的数据库(1 条记录应该到 SecurityLog,多条到 SecurityLogOfficer),但由于我调用了 savechanes() 两次,它实际上是在将多条记录发布到 SecurityLog db 和第二个 for 循环保存我收到一个错误
当 IDENTITY_INSERT 设置为 OFF 时,无法为表“SecurityLogOfficer”中的标识列插入显式值
_context.SecurityLog.Add(SecurityLog);
//We need to ensure we have the ID of the newly posted event
_context.SaveChanges();
int tempSecurityLogID = SecurityLog.ID;
for (int i = 0; i < SelectedOfficerIds.Length; i++)
{
SecurityLogOfficer.SecurityLogID = tempSecurityLogID;
SecurityLog = null;
SecurityLogOfficer.OfficerID = SelectedOfficerIds[i];
_context.SecurityLogOfficer.Add(SecurityLogOfficer);
await _context.SaveChangesAsync();
}
Message = "Entry added successfully!";
有没有办法清除 SecurityLog 的 _context,所以我只发布一次,我该如何解决 identity_insert 问题?数据库 SecurityLogOfficer 已启用身份插入。
2020 年 1 月 9 日更新
@XingZou - 感谢您的快速回复。我尝试执行你的步骤,一切都很完美!!!
如果您不介意,我还有一个问题?我试图在编辑页面上获取选定值的列表,但无法设置这些值。这是我迄今为止尝试过的......
这是我的编辑页面模型...
[BindProperty]
public MultiSelectList GetExistingSelectedOfficerIds { get; set; }
public async Task<IActionResult> OnGetAsync(int? id)
{
var i = _context.SecurityLogOfficer.Where(a => a.SecurityLogID == SecurityLog.ID);
SecurityLogOfficers.AddRange(i);
int[] GetExistingSelectedOfficerIds = new int[SecurityLogOfficers.Count];
int itemCount = 0;
foreach (var item in SecurityLogOfficers)
{
GetExistingSelectedOfficerIds[itemCount] = item.OfficerID;
itemCount++;
}
return Page();
}
这是我的编辑剃须刀页面...
<select id="multiple" asp-for= "GetExistingSelectedOfficerIds" multiple="multiple" class="selectpicker form-control" asp-items="ViewBag.Officer">
</select>
<span asp-validation-for="GetExistingSelectedOfficerIds" class="text-danger"></span>
【问题讨论】:
-
你能发布你用来从选择列表中读取数据的代码吗?谢谢。
-
我认为您正在寻找的内容已经在页面顶部。可能是我误会了?
-
SecurityLog和Officer是什么关系?一对多还是多对多?
asp-for="SecurityLog.Officer"没用,因为你选择的是officer ID列表 -
SecurityLog和Officer之间没有直接关系。 SecurityLog 和 SecurityLogOfficer 之间是一对多的关系,SecurityLogOfficer 和Officer 之间是多对一的关系。
标签: c# sql asp.net-core razor razor-pages