Rob*_*b C 2 c# sql razor asp.net-core razor-pages
在这里,我可以在创建页面上绑定多选选择列表。
<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();
}
Run Code Online (Sandbox Code Playgroud)
我遇到的最大问题是我正在尝试编辑/发布值,但我的模型中没有可以绑定的直接字段。
我在这里找到了一个很好的例子,但它只向您展示如何保存 1 个选择。 https://www.learnrazorpages.com/razor-pages/forms/select-lists
我的 SecurityLog 模型有这个
public virtual Officer Officer { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的军官模型有这个
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
我没有 SecurityLogOfficer 模型。我需要一个吗?
这是我的数据库架构和示例结果
任何援助将不胜感激!
* 更新 *
感谢您建议绑定到列表并将 asp-for 更改为该列表。这是我更新的代码。SelectedOfficerIds 确实存储所选的 ID。
<select id="multiple" asp-for="SelectedOfficerIds" multiple="multiple" class="selectpicker form-control" asp-items="ViewBag.Officer">
</select>
Run Code Online (Sandbox Code Playgroud)
我正在发布到两个不同的数据库(1 条记录应发送到 SecurityLog,多条记录应发送到 SecurityLogOfficer),但由于我调用 savechanes() 两次,它实际上将多条记录发送到 SecurityLog 数据库,并且在第二个 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!";
Run Code Online (Sandbox Code Playgroud)
有没有办法清除 SecurityLog 的 _context,这样我只发布一次,如何解决 Identity_insert 问题?数据库 SecurityLogOfficer 已插入身份。
更新 1/9/2020
@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();
}
Run Code Online (Sandbox Code Playgroud)
这是我的编辑剃刀页面...
<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>
Run Code Online (Sandbox Code Playgroud)
您需要将下拉列表绑定到 int 列表而不是对象。
\n\n在 PageModel 中,添加一个新属性来存储所有选定的 Id:
\n\n[BindProperty]\npublic int[] SelectedOfficerIds { get; set; }\nRun Code Online (Sandbox Code Playgroud)\n\n在 Razor Pages\xef\xbc\x8c 上将多个选择绑定到SelectedOfficerIds
<form method="post">\n <div asp-validation-summary="ModelOnly" class="text-danger"></div>\n <div class="form-group">\n <label asp-for="SecurityLog.EventDate" class="control-label"></label>\n <input asp-for="SecurityLog.EventDate" class="form-control" />\n <span asp-validation-for="SecurityLog.EventDate" class="text-danger"></span>\n </div>\n <div class="form-group">\n <label class="control-label">Officers</label>\n <select id="multiple" asp-for="SelectedOfficerIds" multiple="multiple" class="selectpicker form-control" asp-items="ViewBag.Officer">\n </select>\n </div>\n\n <div class="form-group">\n <input type="submit" value="Create" class="btn btn-primary" />\n </div>\n</form>\nRun Code Online (Sandbox Code Playgroud)\n\n当您提交表单时,您将在帖子处理程序中获得安全日志的新官员 ID 列表。
\n\n更新 1/9/2020
\n\n\n\n\nSecurityLog和Officer之间没有直接关系。SecurityLog 和SecurityLogOfficer 之间存在一对多关系,SecurityLogOfficer 和Officer 之间存在多对一关系。
\n
从你的描述来看,和之间是多对多关系。\n1.删除of ,现在使用复合键SecurityLogOfficerIDSecurityLogOfficer
public class SecurityLogOfficer\n{\n public int SecurityLogID { get; set; }\n public SecurityLog SecurityLog { get; set; }\n\n public int OfficerID { get; set; }\n public Officer Officer { get; set; }\n}\npublic class Officer\n{\n public int ID { get; set; }\n\n //other properties\n\n public List<SecurityLogOfficer> SecurityLogOfficers { get; set; }\n}\n\npublic class SecurityLog\n{\n public int ID { get; set; }\n\n //other properties\n\n public virtual List<SecurityLogOfficer> SecurityLogOfficers { get; set; }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n2.配置多对多关系,如下所示。
\n\npublic class RazorpagesCoreContext : DbContext\n{\n public RazorpagesCoreContext (DbContextOptions<RazorpagesCoreContext> options)\n : base(options)\n {\n }\n\n\n public DbSet<Officer> Officer { get; set; }\n public DbSet<SecurityLog> SecurityLog { get; set; }\n public DbSet<SecurityLogOfficer> SecurityLogOfficer { get; set; }\n\n protected override void OnModelCreating(ModelBuilder modelBuilder)\n {\n modelBuilder.Entity<SecurityLogOfficer>()\n .HasKey(t => new { t.SecurityLogID, t.OfficerID });\n\n modelBuilder.Entity<SecurityLogOfficer>()\n .HasOne(pt => pt.SecurityLog)\n .WithMany(p => p.SecurityLogOfficers)\n .HasForeignKey(pt => pt.SecurityLogID);\n\n modelBuilder.Entity<SecurityLogOfficer>()\n .HasOne(pt => pt.Officer)\n .WithMany(t => t.SecurityLogOfficers)\n .HasForeignKey(pt => pt.OfficerID);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n3.添加迁移并更新数据库。
\n\n\n\n\n有没有办法清除 SecurityLog 的 _context 所以我只发布一次
\n
4.在您的PageModel中,保存如下数据
\n\n[BindProperty]\npublic SecurityLog SecurityLog { get; set; }\n\npublic List<SecurityLogOfficer> SecurityLogOfficers { get; set; } = new List<SecurityLogOfficer>();\n\n[BindProperty]\npublic int[] SelectedOfficerIds { get; set; }\n\npublic async Task<IActionResult> OnPostAsync()\n {\n _context.SecurityLog.Add(SecurityLog);\n foreach (var id in SelectedOfficerIds)\n {\n var item = new SecurityLogOfficer()\n {\n SecurityLog = SecurityLog,\n Officer = await _context.Officer.FirstOrDefaultAsync(s => s.ID == id),\n };\n SecurityLogOfficers.Add(item);\n }\n _context.SecurityLogOfficer.AddRange(SecurityLogOfficers);\n await _context.SaveChangesAsync();\n\n return RedirectToPage("./Index");\n }\nRun Code Online (Sandbox Code Playgroud)\n\n更新 1/10/2020
\n\n要在编辑页面中获取多个选定值,请在return Page()获取处理程序之前使用以下代码
ViewData["Officer"] = new MultiSelectList(_context.Officers.Where(a => a.Active == "Y"), "ID", "FullName", GetExistingSelectedOfficerIds);\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
4604 次 |
| 最近记录: |