C# 参数'的输入为空;图书馆ID';不可为空的类型';System.Int32';对于方法';System.Web.Mvc.ActionResult PlaceCheckout(Int32,Int32)

C# 参数'的输入为空;图书馆ID';不可为空的类型';System.Int32';对于方法';System.Web.Mvc.ActionResult PlaceCheckout(Int32,Int32),c#,asp.net-mvc,model-binding,C#,Asp.net Mvc,Model Binding,我是MVC新手。在视图中,我试图将assetId和libraryId从视图发送到控制器,但是libraryId没有拾取,我试图找到解决方案,但没有任何运气 在视图中 @using (Html.BeginForm("PlaceCheckout", "Catalog", FormMethod.Post)) { @Html.HiddenFor(a=>a.AssetId) <div> Please insert a Library Card ID. @Html.TextBo

我是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>
}
这些是我的扩展方法

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();
        }
您的视图(
@Html.TextBoxFor(a=>a.librarycardd)
)正在发送librarycardd而不是libraryId,您的控制器
PlaceCheckout
操作需要两个不可为空的参数-assetId和libraryId(
公共操作结果PlaceCheckout(int-assetId,int-libraryId)
)。由于未提供libraryId,因此将出现异常

请在LibraryCardId中修改控制器
PlaceCheckout
操作,如下所示:

[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的数据类型。因此,请相应地修复它。

如果视图是PlaceCheckout,则应接受一个模型而不是两个参数,请尝试PlaceCheckout(CheckoutModel)
[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 });
}