Здесь я могу связать список множественного выбора на странице создания.
<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 для этого списка. Вот мой обновленный код. SelectedOfficerIds действительно сохраняет выбранные идентификаторы.
<select id="multiple" asp-for="SelectedOfficerIds" multiple="multiple" class="selectpicker form-control" asp-items="ViewBag.Officer">
</select>
Я отправляю сообщения в две разные базы данных (1 запись должна go в SecurityLog и несколько в SecurityLogOfficer), но так как я вызываю savechanes () дважды, это фактически отправляя несколько записей в базу данных SecurityLog и на секунду для l oop save я получаю сообщение об ошибке
Невозможно вставить явное значение для столбца идентификации в таблице 'SecurityLogOfficer', когда для IDENTITY_INSERT установлено значение OFF
_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!";
Есть ли способ очистить _context для SecurityLog, чтобы я публиковал только один раз, и как мне решить проблему 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();
}
Вот моя страница редактирования бритвы. ..
<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>