【发布时间】: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