Сначала обновите ваш метод Create
GET
следующим образом:
public async Task<IActionResult> Create()
{
var teachers = await _context.Teachers.Where(t => t.Class == null).ToListAsync();
ViewData["Teachers"] = new SelectList(teachers,"ID","FullName");
return View();
}
Затем напишите свой FormGroup
для select list
следующим образом:
<div class="form-group">
<label asp-for="TeacherID" class="control-label">Teacher</label>
<select asp-for="TeacherID" class ="form-control" asp-items="ViewBag.Teachers">
</select>
<span asp-validation-for="TeacherID" class="text-danger"></span>
</div>
Теперь обновите свой Create
POST
метод следующим образом:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Class @class)
{
if (ModelState.IsValid)
{
_context.Classes.Add(@class); // now your @class is containing the `TeacheID` value selected from drop-down.
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View("Index");
}
Теперь все должно работать нормально!
Я подозреваю, что лучше всех вы можно сделать, это убедиться, что вы используете перегрузку для ShowDialog
, которая принимает IWin32Window
для использования в качестве родительского. Это может помочь ему выбрать подходящее место; чаще всего:
using(var dlg = new OpenFileDialog()) {
.... setup
if(dlg.ShowDialog(this) == DialogResult.OK) {
.... use
}
}
OpenFileDialog и SaveFileDialog располагаются в верхнем левом углу клиентской области последнего отображаемого окна. Так что просто создайте новое невидимое окно, расположенное там, где вы хотите, чтобы диалоговое окно появлялось, прежде чем создавать и показывать это диалоговое окно.
Window dialogPositioningWindow = new Window();
dialogPositioningWindow.Left = MainWindow.Left + <left position within main window>;
dialogPositioningWindow.Top = MainWindow.Top + <top position within main window>;
dialogPositioningWindow.Width = 0;
dialogPositioningWindow.Height = 0;
dialogPositioningWindow.WindowStyle = WindowStyle.None;
dialogPositioningWindow.ResizeMode = ResizeMode.NoResize;
dialogPositioningWindow.Show();// OpenFileDialog is positioned in the upper-left corner
// of the last shown window (dialogPositioningWindow)
Microsoft.Win32.OpenFileDialog dialog = new Microsoft.Win32.OpenFileDialog();
...
if ((bool)dialog.ShowDialog()){
...
}
dialogPositioningWindow.Close();
Вот как я это сделал:
Точка, в которой я хочу отобразить OpenFileDialog:
Thread posThread = new Thread(positionOpenDialog);
posThread.Start();
DialogResult dr = ofd.ShowDialog();
Код репозиции:
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);
/// <summary>
/// Find the OpenFileDialog window when it appears, and position it so
/// that we can see both dialogs at once. There is no easier way to
/// do this (&^%$! Microsoft!).
/// </summary>
private void positionOpenDialog ()
{
int count = 0;
IntPtr zero = (IntPtr)0;
const int SWP_NOSIZE = 0x0001;
IntPtr wind;
while ((wind = FindWindowByCaption(zero, "Open")) == (IntPtr)0)
if (++count > 100)
return; // Find window failed.
else
Thread.Sleep(5);
SetWindowPos(wind, 0, Right, Top, 0, 0, SWP_NOSIZE);
}
Я запускаю Поток, который ищет окно с заголовком «Открыть». (Обычно встречается за 3 итерации или 15 миллисекунд.) Затем я устанавливаю его положение с помощью полученного дескриптора. (См. Документацию SetWindowPos для параметров позиции / размера.)
Kludgy.
Существует довольно старый пример одного подхода в MSDN.
http://msdn.microsoft.com/en-us/library/ms996463.aspx
Включает весь код, необходимый для реализации вашего собственного класса OpenFileDialog, который обеспечивает расширяемость.
Прочтите эту статью на CodeProject. Отрывок:
Вот когда удобный .NET NativeWindow появляется на картинке, NativeWindow - это оконная оболочка, в которой он обрабатывает сообщения, отправленные связанный с ним дескриптор. Это создает NativeWindow и связывает Дескриптор OpenFileWindow к нему. Из этого точка, каждое сообщение, отправленное на OpenFileWindow будет перенаправлен на наш собственный метод WndProc в Вместо этого NativeWindow, и мы можем отменить, изменить или позволить им пройти через.
В нашем WndProc мы обрабатываем сообщение WM_WINDOWPOSCHANGING. Если открытый открывается диалог, тогда мы изменим исходный горизонтальный или вертикальный размер в зависимости от StartLocation устанавливается пользователем. Это увеличит размер создаваемого окна. Эта происходит только один раз, когда открыто.
Также мы обработаем сообщение WM_SHOWWINDOW. Здесь все элементы управления внутри исходного OpenFileDialog находятся создан, и мы собираемся добавить наш контроль в диалоге открытия файла. Это делается путем вызова Win32 API. SetParent. Этот API позволяет вам изменить родительское окно. Тогда в основном что он делает, это прикрепляет наш контроль к исходному OpenFileDialog в место, которое он устанавливает, в зависимости от значение свойства StartLocation.
Преимущество этого метода в том, что мы по-прежнему иметь полный контроль над элементы управления, прикрепленные к Окно OpenFileDialog. Это означает, что мы может получать события, методы вызова и делаем с ними все, что хотим управления.