Не могу получить значения внешнего ключа при отправке формы - PullRequest
0 голосов
/ 22 мая 2019

Я сейчас работаю в моем ASP.NET Core проекте. Я создал несколько классов, которые я сопоставил с таблицами базы данных.

Класс поручения:

public class Errand : IDbEntity
{
    public int Id { get; set; }
    public int PANumber { get; set; }
    public string Description { get; set; }
    public string Issuer { get; set; }
    public string Stakeholders { get; set; }
    public string Background { get; set; }
    public string DescriptionOfMission { get; set; }
    public string AcceptanceCriteria { get; set; }
    public string TestObject { get; set; }
    public DateTime AvailableFrom { get; set; }
    public DateTime TestStart { get; set; }
    public DateTime TestDelivery { get; set; }
    public DateTime Created { get; set; }
    public DateTime Updated { get; set; }

    public int CoreId { get; set; }
    public virtual Core Core { get; set; }

    public int MachineTypeId { get; set; }
    public virtual MachineType MachineType { get; set; }

    public int ProjectNrId { get; set; }
    public virtual ProjectNumber ProjectNr { get; set; }

    public int TestTypeId { get; set; }
    public virtual Group TestType { get; set; }

    public virtual DBErrandStatus status { get; set; }
}

А остальные классы выглядят так же, как и все остальные. Вот класс Core:

public class Core : IDbEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime Created { get; set; }
    public DateTime Updated { get; set; }

    public virtual ICollection<Errand> Errands { get; set; }
}

Я выполнил миграцию в базу данных, и все отлично работает, а таблица Errand содержит внешние ключи Core, Group, MachineType & ProjectNumber.

Теперь к моей проблеме. Я пытаюсь создать A Errand и в представлении, где пользователь выберет значения для поручения, я сделал выпадающие списки для внешних ключей. вот код для этого:

 <form method="post" asp-controller="Home" asp-action="ExecuteCreateErrand">
    <div class="row">
        <div class="col-md-2">
            <label>PA number:</label>
            <input asp-for="@Model.errand.PANumber" class="form-input" type="text" />
        </div>
        <div class="col-md-4">
            <label>Title:</label>
            <input asp-for="@Model.errand.Description" class="form-input" placeholder="Title" type="text" />
        </div>
        <div class="col-md-2">
            <label>Core:</label>
            <select asp-for="@Model.errand.Core" class="form-input">
                @foreach(var core in Model.Core)
                {
                    <option>@core.Name</option>
                }
            </select>
        </div>
        <div class="col-md-4">
            <label>Project Nr:</label>
            <select asp-for="@Model.errand.ProjectNr" class="form-input">
                @foreach(var projNr in Model.ProjectNumber)
                {
                    <option>@projNr.Name</option>
                }
            </select>
        </div>
    </div>
    <div class="row">
        <div class="col-md-2">
            <label>Machine type:</label>
            <select asp-for="@Model.errand.MachineType" class="form-input">
                @foreach (var MT in Model.MachineType)
                {
                    <option>@MT.Name</option>
                }
            </select>
        </div>
        <div class="col-md-4">
            <label>Issuer:</label>
            <input asp-for="@Model.errand.Issuer" class="form-input" value="@Model.User.Username" type="text" readonly />
        </div>
        <div class="col-md-2">
            <label>Test type</label>
            <select asp-for="@Model.errand.TestType" class="form-input">
                @foreach (var TestType in Model.TestType)
                {
                    <option>@TestType.Name</option>
                }
            </select>
        </div>
        <div class="col-md-4">
            <label>Stakeholders</label>
            <input class="form-input" asp-for="@Model.errand.Stakeholders" placeholder="Stakeholders" type="text" />
        </div>
    </div>
    <div class="row">
        <div id="sandbox-container" class=" span5 col-md-4">
            <label>Testobject avalible from:</label>
            <input asp-for="@Model.errand.AvailableFrom" class="form-input" type="text" value="@DateTime.Now.ToString("yyyy/MM/dd")" />
        </div>

        <div id="sandbox-container" class=" span5 col-md-4">
            <label>Desired start of test:</label>
            <input asp-for="@Model.errand.TestStart" class="form-input" type="text" value="@DateTime.Now.ToString("yyyy/MM/dd")" />
        </div>

        <div id="sandbox-container" class=" span5 col-md-4">
            <label>Desired end of test:</label>
            <input asp-for="@Model.errand.TestDelivery" class="form-input" type="text" value="@DateTime.Now.ToString("yyyy/MM/dd")" />
        </div>
    </div>
    <div class="row">
        <div class="col-md-10"></div>
        <div class="col-md-2">
            <button type="submit" class="btn btn-lg btn-block mt-4 vBtn">Create Errand</button>
        </div>
    </div>
</form>

Но когда я позже установил точку останова для действия, которое выполняется после отправки формы, я получаю, что Errand.Core = null и Errand.CoreId = 0

Вот код действия:

public IActionResult ExecuteCreateErrand([FromForm] Errand errand)
    {
        var SQL = new SQLErrandStorage();
        var handler = new ErrandHandler(SQL);
        handler.Create(errand);

        return RedirectToAction("RenderAllErrandsView", "Home");
    }

[FromForm] Errand errand возвращает это

Core = null и CoreId = 0

Действие вызывает этот метод:

public void Create(Errand errand)
{
     errandStorage.CreateErrand(errand);
}

, который в свою очередь вызывает этот метод, который создает поручение:

public void CreateErrand(Errand errand)
    {
        using (var db = new PADBContext())
        {
            db.Errand.Add(errand);
            db.SaveChanges();
        }
    }

У меня вопрос, как я могу сделать внешние ключи прикрепленными к отправленной форме. Как я могу изменить значения Core = null and CoreId = 0 на те, которые я выбрал в раскрывающемся списке?

Надеюсь, это достаточно хорошо объясняет мою проблему. Я был бы очень признателен за помощь или обратную связь. Заранее спасибо!

1 Ответ

1 голос
/ 23 мая 2019

Похоже, проблема связана с ошибкой привязки значения asp-for в помощнике тегов select. Select Tag Helper asp-for указывает имя свойства модели для элемента select, а не модели.

Если вы хотите получить Errand.CoreId, вы можете установить asp-for помощника тега select, как показано ниже:

<label>Core:</label>
<select asp-for="@Model.errand.CoreId" class="form-input">
      @foreach (var core in Model.Core)
       {
         <option value="@core.Id">@core.Name</option>
       }
 </select>

Если вы хотите получить Errand.Core, вы можете установить asp-for для selectтег помощника, как показано ниже:

<label>Core:</label>
<select asp-for="@Model.errand.Core.Id" class="form-input">
      @foreach (var core in Model.Core)
       {
         <option value="@core.Id">@core.Name</option>
       }
 </select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...