Ядро asp.net создание / обновление постороннего ключа - PullRequest
0 голосов
/ 10 января 2019

Я добавил в свой класс "Todo" иностранный ключ в мой класс "Аптека". Когда я добавляю или редактирую Todo, никакая Аптека не может быть связана (из окна выбора). Вот моя модель:

public class Todo
    {
        [Key]
        public int ID { get; set; }

        public Pharmacy Pharmacy { get; set; }
    }

public class Pharmacy
    {
        [Key]
        public int PharmacyID { get; set; }

        public string Name { get; set; }

        public string Pharmacist { get; set; }

        [DataType(DataType.PhoneNumber)]
        public int Phone { get; set; }

        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        public int NPA { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public string Canton { get; set; }
    }

Мой код перечисляет все аптеки на моем Todo:

public class PharmacynamePageModel : PageModel
    {
        public SelectList PharmacyNameSL { get; set; }

        public void PopulatePharmacysDropDownList(ApplicationDbContext _context, object selectedPharmacy = null)
        {
            var query = (from p in _context.Pharmacy orderby p.Name select p).ToList();

            PharmacyNameSL = new SelectList(query, "PharmacyID", "Name", selectedPharmacy);
        }
    }

Хорошо, на этом этапе у меня есть этот код в моей HTML-форме:

<label asp-for="Todo.Pharmacy" class="control-label"></label>
                <select asp-for="Todo.Pharmacy" class="form-control"
                        asp-items="Model.PharmacyNameSL">
                    <option value="">-- Select a Pharmacy --</option>
                </select>
                <span asp-validation-for="Todo.Pharmacy" class="text-danger" />

и мой PostAsync () в мои контроллеры создания и редактирования:

public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            var emptyTask = new Todo();

            if (await TryUpdateModelAsync(emptyTask, "Todo",  
                s => s.ID, s => s.OwnerID, 
                s => s.Title, s => s.Description,
                s => s.DueDate,
                s => s.Pharmacy,
                s => s.Priority))
            {
                emptyTask.Status = EnumStatus.Open;
                _context.Todo.Add(emptyTask);
                await _context.SaveChangesAsync();
                if (emptyTask.OwnerID != HttpContext.User.Identity.Name)
                {
                    LogVM.AddLog("Todos", $"{HttpContext.User.Identity.Name} attributed a new task to {emptyTask.OwnerID}.", _context);
                }
                return RedirectToPage("./Index");
            }

            PopulatePharmacysDropDownList(_context, emptyTask.Pharmacy);

            return RedirectToPage("./Index");
        }

Все данные сопоставлены / связаны, но поле аптеки, значение которого всегда равно нулю.

Надеюсь, вы можете помочь мне:).

Спасибо за аванс.

1 Ответ

0 голосов
/ 10 января 2019

При публикации привязка данных свяжет «dataValueField» элемента Select с элементом данных модели .

Вы пытаетесь сопоставить весь объект выбранному элементу Select. Вы упомянули, что только поле «Аптека» является пустым - скорее всего, потому что из предоставленного вами кода это единственное поле, которое вы, вероятно, пытаетесь изменить. Значения для других элементов, вероятно, установлены в самом коде страницы (и не связаны с данными на Post).

Я бы предложил создать отдельное поле для выбранного элемента «Аптека» и связать его с полем «Выбор».

Внутри вашего класса PharmacynamePageModel создайте публичное свойство "bindable", например:

 [BindProperty]
 public string SelectedPharmacy { get; set; }

А затем в коде Razor вместо привязки к «Аптеке» привязать к «SelectedPharmacy» (в атрибуте asp-for), например:

                <select asp-for="SelectedPharmacy" class="form-control"
                        asp-items="Model.PharmacyNameSL">
                    <option value="">-- Select a Pharmacy --</option>
                </select>
                <span asp-validation-for="Todo.Pharmacy" class="text-danger" />

Теперь на бланке формы должен быть доступен выбранный идентификатор аптеки. Вы можете использовать Id по своему желанию.

Надеюсь, это работает. Если да, отметьте это как ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...