Podwójne przejscie akcji w kontrolerze

0

Cześć, mam (mam nadzieje) mały problem z aplikacją postawioną na asp.net core 2.0. Podczas testów okazało się, że na przeglądarkach Edge oraz Chrome po wypełnieniu formularza i kliknięciu przycisku "Zapisz", program 2 krotnie wykonuje kod w akcji Post Create. Podczas debugowania, przechodząc z lini do lini, muszę 2 krotnie kliknąć przycisk, żeby przejść do kolejnej części kodu. Na firefox wszystko działa bez zarzutu. W czym może być problem ?

1

Jak nie pokażesz kodu to tylko on Tobie będzie w stanie pomóc:

0
        // GET: Transactions/Create
        public IActionResult Create(int? idt)
        {
            var createTransactionView = new CreateTransactionView();

              var spot = _context.Inventories.Include(x => x.Article).Include(x => x.Spot).Where(x => x.ID == idt).FirstOrDefault();

              var StatusPomocniczy = new Status();

              switch (spot.Status)
              {
                  case "W produkcji":
                      StatusPomocniczy = Status.WProdukcji;
                      break;
                  case "Gotowe":
                      StatusPomocniczy = Status.Gotowe;
                      break;
                  case "Brak informacji":
                      StatusPomocniczy = Status.BrakInfo;
                      break;
                  case "Złom":
                      StatusPomocniczy = Status.Zlom;
                      break;
              }

              createTransactionView = new CreateTransactionView
              {
                  Part = spot.Article.Part,
                  Place = spot.Spot.Place,
                  Revision = spot.Revision,
                  Status = StatusPomocniczy
                  //Status = spot.Status
              };
                
               return View("CreateSolo", createTransactionView);
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("ID,Quantity,CreateDateTime,CreatedBy,ArticleID,Place,OrderID,Part,Price,OrderNumber,Status,Revision")] CreateTransactionView createTransactionView)
        {
            Transaction transaction = new Transaction();

            var article = _context.Articles.Where(x => x.Part == createTransactionView.Part).FirstOrDefault();
            var spot = _context.Spots.Where(x => x.Place == createTransactionView.Place).FirstOrDefault();

            if (article == null)
            {
                ModelState.AddModelError(nameof(article.Part),
                    "Brak pozycji w systemie.");
            }
            if (spot == null)
            {
                ModelState.AddModelError(nameof(createTransactionView.Place),
                    "Brak podanego miejsca magazynowego.");
            }
0

Ok i jeszcze widok jeśli możesz, form oraz js jeżeli masz

0
@model Magazyn.Models.CreateTransactionView

@{
    ViewData["Title"] = "Create";
}


<h2>Create</h2>

<h4>Inventory</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Part" class="control-label"></label>
                <input asp-for="Part" placeholder="@Model.Part" class="form-control" />
                <span asp-validation-for="Part" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Revision" class="control-label"></label>
                <input asp-for="Revision" placeholder="@Model.Revision" class="form-control" />
                <span asp-validation-for="Revision" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Quantity" class="control-label"></label>
                <input asp-for="Quantity" class="form-control" />
                <span asp-validation-for="Quantity" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Place" class="control-label"></label>
                @*<input asp-for="Place" class="form-control" />*@
                <input asp-for="Place" placeholder="@Model.Place" class="form-control" />
                <span asp-validation-for="Place" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Status" class="control-label"></label>
                <select asp-for="Status" class="form-control" placeholder="@Model.Status" asp-items="Html.GetEnumSelectList<Status>()"></select>
            </div>

            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    <script src="/lib/jquery/dist/jquery.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("input.input-validation-error")
                .closest(".form-group").addClass("has-danger")</script>
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
}

1

Ok, to mamy na czym działać.
Ja bym wyrzucił to

$(document).ready(function () {
            $("input.input-validation-error")
                .closest(".form-group").addClass("has-danger")</script>

A dodał do akcji to:

if(!ModelState.IsValid)
 // Add model errors
 return View(Model);

Jeżeli klikasz w przycisk dwa razy to może to jest powodem wykonania się 2 razy akcji kontrolera?
Możesz pokazać kod sprawdzania poprawności modelu w akcji POST?

0

Na pierwszy rzut oka wydaje się że wszystko działa. To znaczy funkcja, która sprawdzała poprawność zaraz po wypełnieniu okna formularza nie działa (co jest oczywiste), ale kod wykonuje się tylko raz.
Dzięki za pomoc.

0

Jak chcesz sztucznie wywołać walidację przy wczytaniu strony z pustymi danymi zrób tak:

public class CreateModel
{
  [Required]
  public string Name { get; set; }
}

[HttpGet]
public async Task<IActionResult> Create()
{
  return await Create(new CreateModel());
}
[HttpPost]
public async Task<IActionResult> Create(CreateModel input)
{
  if(!ModelState.IsValid)
  {
    // Dodaj błędy modelu
    return View(input);
  }
  await _dbContext.Items.AddAsync(input);
  await _dbContext.SaveChangesAsync();
  return RedirectToAction("Index");
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1