【问题标题】:Null entry for parameter 'libraryId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult PlaceCheckout(Int32, Int32)方法'System.Web.Mvc.ActionResult PlaceCheckout(Int32,Int32)的不可为空类型'System.Int32'的参数'libraryId'的空条目
【发布时间】:2020-02-21 14:41:01
【问题描述】:

我是 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 被省略,当用户输入该卡的 ID 时设置

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();
        }

【问题讨论】:

  • 他们的观点是 PlaceCheckout 应该接受一个模型而不是两个参数,试试 PlaceCheckout(CheckoutModel)

标签: c# asp.net-mvc model-binding


【解决方案1】:

您的视图 (@Html.TextBoxFor(a =&gt; 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 的数据类型。所以,请相应地修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多