Почему значение bool не отображается правильно? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть значение bool, которое я использую для различения guish между первым элементом в ряду других элементов, сохраняемых в таблицу ссылок в моей БД. Конструктор для ViewModel устанавливает по умолчанию значение true. Когда моя ViewModel публикуется в контроллере, мое действие контроллера меняет это значение на false и передает отредактированную ViewModel обратно в представление, где это значение сохраняется в скрытом поле. У меня проблема в том, что после изменения значения мой вид по-прежнему отображает это значение как true. У кого-нибудь есть идеи, где я иду не так?

У меня также есть проблема, когда я сбрасываю значения обратно на значения по умолчанию, но они сохраняются, когда представление перезагружается после выполненного действия публикации.

ViewModel

public class NewScriptViewModel
{
    public Patient Patient { get; set; }
    public int PatientId { get; set; }
    public int PrescriberId { get; set; }
    public int DrugId { get; set; }
    public int Qty { get; set; }
    public string Directions { get; set; }
    public bool FirstItem { get; set; }
    public bool NextItem { get; set; }
    public int ScriptId { get; set; }
    public NewScriptViewModel()
    {
        FirstItem = true;
        NextItem = false;
    }
}

Вид

@model DispensingApp.Models.ViewModels.NewScriptViewModel

@{
    ViewData["Title"] = "New Script";
}

<h1>@Model.Patient.FullName</h1>
<h3>HCN : @Model.Patient.HCN</h3>

<hr />
<div class="row">
    <br />
    <div class="col-12" onload="newScriptItemForm.reset()">

        <form id="newScriptItemForm" asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input asp-for="ScriptId" type="hidden" value="@ViewData["ScriptId"]" />
            <input asp-for="DrugId" type="hidden" />

            <table id="drugSelectionTable" class="table table-hover">
                <thead>
                    <tr class="table-secondary">
                        <th></th>
                        <th>Name</th>
                        <th>Pack Size</th>
                        <th>Generic Ingredients</th>
                        <th>Stock</th>

                    </tr>
                </thead>
            </table>

            <div class="form-group">
                <div><input asp-for="PatientId" type="hidden" /></div>

            </div>
            <div class="form-group row">
                <div class="col-2">
                    <label asp-for="Patient.Prescriber.FullName" class="control-label"></label>
                </div>
                <div class="col-4">
                    @if (Model.FirstItem)
                    {
                        <select asp-for="PrescriberId" class="form-control" asp-items="ViewBag.PrescriberId"></select>

                    }
                    else
                    {
                        <input asp-for="PrescriberId" type="hidden" />
                        <input type="text" placeholder="@Model.PrescriberId" class="disabled" />
                    }
                </div>
            </div>

            <div class="form-group row">
                <div class="col-2">
                    <label asp-for="Qty" class="control-label"></label>
                </div>
                <div class="col-4">
                    <input asp-for="Qty" class="form-control" />
                </div>
                <span asp-validation-for="Qty" class="text-danger"></span>
            </div>
            <div class="form-group row">
                <div class="col-2">
                    <label asp-for="Directions" class="control-label"></label>
                </div>
                <div class="col-4">
                    <textarea asp-for="Directions" rows="3" class="form-control"></textarea>
                </div>
                <span asp-validation-for="Directions" class="text-danger"></span>
            </div>

            <div class="form-group row">
                <div class="col-2">
                    <input asp-for="FirstItem" type="hidden" />
                    <input id="nextItem" asp-for="NextItem" type="hidden" />
                    <button id="nextItemBtn" @*type="submit" value="Next Item"*@ class="btn btn-primary form-control">Next Item</button>
                </div>
                <div class="col-2">
                    <button asp-action="NewScript" class="btn btn-success form-control">Next Script</button>
                </div>
                <div class="col-2">
                    <a asp-controller="Patients" asp-action="Details" asp-route-id="@Model.PatientId" class="btn btn-danger form-control">Cancel</a>
                </div>
            </div>
        </form>
    </div>
</div>

Пост контроллера

 [HttpPost]
 [ValidateAntiForgeryToken]
 public async Task<IActionResult> Create(NewScriptViewModel viewModel,
                                         [Bind("PatientId, PrescriberId")] Script script,
                                         [Bind("DrugId, Qty, Directions")] ScriptDrug scriptDrug)
 {
     if (ModelState.IsValid)
     {
         //if first item of script -- create script entry 
         if (viewModel.FirstItem)
         {
             _context.Script.Add(script);
             await _context.SaveChangesAsync();
             viewModel.ScriptId = script.Id;
             viewModel.FirstItem = false;
         }
         scriptDrug.ScriptId = (int)viewModel.ScriptId;
         var drug = _context.Drug.Find(scriptDrug.DrugId);
         drug.StockQty -= scriptDrug.Qty;
         _context.ScriptDrug.Add(scriptDrug);
         await _context.SaveChangesAsync();

         return await Create(script.PatientId, viewModel);
     }
     viewModel.NextItem = false;
     return await Create(script.PatientId, viewModel);
 }

Контроллер Get

 public async Task<IActionResult> Create(int id, NewScriptViewModel viewModel)
 {
     var patient = await _context.Patient.FindAsync(id);
     var vm = new NewScriptViewModel();

     //if not first item, reset view model but retain script id
     if (!viewModel.FirstItem)
     {
         vm = viewModel;
     }
     vm.Patient = patient;
     vm.PatientId = patient.Id;

     return View(vm);
 }

HTML, который отображается в браузере после всего этого выглядит следующим образом:

 <div class="col-2">
      <input type="hidden" data-val="true" data-val-required="The FirstItem field is required." id="FirstItem" name="FirstItem" value="True">
      <input id="nextItem" type="hidden" data-val="true" data-val-required="The NextItem field is required." name="NextItem" value="True">
      <button id="nextItemBtn" class="btn btn-primary form-control">Next Item</button>
 </div>
...