Нулевая запись для параметра 'libraryId' с ненулевым типом 'System.Int32' для метода 'System.Web. Mvc .ActionResult PlaceCheckout (Int32, Int32) - PullRequest
0 голосов
/ 21 февраля 2020

Я новичок в MVC. В представлении я пытаюсь отправить assetId и libraryId из представления в контроллер, однако libraryId не поднимается, я попытался найти решение, но безуспешно

В представлении

@using 
(Html.BeginForm("PlaceCheckout", 
"Catalog", FormMethod.Post))
{
 @Html.HiddenFor(a=>a.AssetId)
 <div>
 Please insert a Library Card ID.
 @Html.TextBoxFor(a => a.LibraryCardId)
 </div>
 div>
 <button type="submit" class="btn btn-success btn-lg">Check out</button>
 </div>
}

Код контроллера, LibraryCardId пропущен и устанавливается, когда пользователь вводит идентификатор для этой карты

public ActionResult Checkout(int id)
{
 var asset = AssetService.Instance.GetByID(id);

 var model = new CheckoutModel
 {
            AssetId = id,
            ImageUrl = asset.ImageUrl,
            Title = asset.Title,
            LibraryCardId = "",
            IsCheckedOut = CheckOutService.Instance.IsCheckedOut(id)
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult PlaceCheckout(int assetId, int libraryId)
    {
        CheckOutService.Instance.CheckoutItem(assetId, libraryId);

        return RedirectToAction("Details", new { id = assetId });
    }

Это мои методы расширения

public void CheckoutItem(int id, int libraryCardId)
    {
            using( var context = new LibraryContext())
        {
                if (IsCheckedOut(id)) 
                return;

            var item = context.LibraryAssets.Include(a => a.Status).First(a => a.Id == id);

            context.Entry(item).State = EntityState.Modified;

            UpdateAssetStatus(id, "Available");

            var now = DateTime.Now;

            var libraryCard = context.LibraryCards.Include(c => c.Checkouts).FirstOrDefault(c => c.Id == libraryCardId);

            var checkout = new Checkout
            {
                LibraryAsset = item,
                LibraryCard = libraryCard,
                Since = now,
                Until = GetDefaultCheckoutTime(now)
            };

            context.Checkouts.Add(checkout);

            var checkoutHistory = new CheckoutHistory
            {
                CheckedOut = now,
                LibraryAsset = item,
                LibraryCard = libraryCard
            };

            context.CheckoutHistories.Add(checkoutHistory);
            context.SaveChanges();
        }

1 Ответ

0 голосов
/ 21 февраля 2020

Ваше представление (@Html.TextBoxFor(a => a.LibraryCardId)) отправляет LibraryCardId, а не libraryId, а действие вашего контроллера PlaceCheckout ожидает два ненулевых параметра - assetId и libraryId (public ActionResult PlaceCheckout(int assetId, int libraryId)). Вы получаете исключение, потому что libraryId не указан.

Пожалуйста, измените действие контроллера PlaceCheckout, чтобы оно использовалось в LibraryCardId, как показано ниже:

[HttpPost]
public ActionResult PlaceCheckout(int assetId, string libraryCardId )
{
    // This extension method takes int version of libraryCardId
    // So, am really not sure the datatype of libraryCardId
    CheckOutService.Instance.CheckoutItem(assetId, libraryCardId );

    return RedirectToAction("Details", new { id = assetId });
}

Из другого действия Checkout, которое вы вставил сюда, я вижу, что libraryCardId это строка. Итак, обновили тип данных второго параметра действия PlaceCheckout. но ваш метод расширения говорит, что libraryCardId - это int. Итак, я действительно не уверен насчет типа данных libraryCardId. Поэтому, пожалуйста, исправьте это соответствующим образом.

...