【发布时间】:2017-06-26 16:18:06
【问题描述】:
我创建了一个页面,用户搜索一本书并使用部分视图加载书籍详细信息。我已经成功地做到了这一点。 用于执行此操作的控制器中的操作方法:
[HttpGet]
public ActionResult LoanSearch(string q)
{
var loans = GetLoans(q);
return PartialView(loans);
}
private List<Loan> GetLoans(string searchString)
{
return db.Loans
.Where(a => a.Book.Name.Contains(searchString))
.ToList();
}
如您所见,LoanSearch 操作方法是用 HTTPGET 修饰的。
对此的看法:
@using (Html.BeginForm())
{
foreach (var item in Model)
{
<ul>
<li>@item.ISBN</li>
<li>@item.Book.Name</li>
<li>@item.Book.Author</li>
<li> @item.FinePrice</li>
</ul>
@Html.ActionLink("Return Book", "LoanSearch", new { id = item.LoanId });
}
}
我想要做的是更新贷款数据库中的 FinePrice 并在书籍数据库中将 onLoan 从 1 更改为 0。当用户点击上面的 Html.ActionLink 时,应该会发生这种情况。
为了实现这一点,我创建了以下 HTTPPOST 操作方法,并且还使用了视图模型,因为我需要同时更新 2 个表(Loan、Book)。(需要视图模型吗?)
[HttpPost]
public ActionResult LoanSearch(BookReturnVM model, string searchString)
{
var bookquery = db.Loans.Where(a => a.Book.Name.Contains(searchString));
var loanquery = db.Loans.Where(a => a.Book.Name == model.BookTitle);
var finePrice = db.Loans.Where(g => g.FinePrice == model.FinePrice);
BookReturnVM model1 = new BookReturnVM
{
OnLoan = model.OnLoan,
FinePrice = model.FinePrice,
};
if (ModelState.IsValid)
{
var fine = db.Loans.FirstOrDefault(g => g.FinePrice == model.FinePrice);
var bookLoan = db.Loans.FirstOrDefault(a => a.Book.Name.Contains(searchString));
if (bookLoan != null)
{ //changes the onloan status to 1 which makes it 'on loan'
bookLoan.Book.OnLoan = 0;
};
db.Entry(bookLoan).State = EntityState.Modified;
db.SaveChanges();
}
return View();
我希望根据以下计算更新 Loan 表中的 FinePrice。 FinePrice 计算是在 Loan 模型中完成的:
private decimal? _FinePrice;
public decimal? FinePrice
{
get
{
if(DateTime.Now>CheckOutDate)
{
this._FinePrice= ((DateTime.Now - CheckOutDate).Days)*0.50M;
}
else
{
this._FinePrice = 0M;
}
return this._FinePrice;
}
set
{
this._FinePrice = value;
}
}
总之,当我搜索一本书时,该书的详细信息会出现(在局部视图中,它确实如此),当我单击一个按钮(在同一局部视图页面上)时,OnLoan(书表)从从 1 到 0,并且为该特定书籍更新了 FinePrice(外借表)。
我认为问题在于 HTTP POST 操作方法,但不知道如何解决此问题以解决上述问题。
感谢您的宝贵时间
【问题讨论】:
-
很抱歉,问题似乎出在哪里?您遇到错误了吗?
-
我想在局部视图中创建一个链接,更新loan表中的fineprice并将book表中的onloan更改为0。fineprice在loan域模型中计算
-
好的,考虑到您的方法被标记为
HttpPost,您将需要使用一些javascript 来发布表单数据,而不是导致GET 的简单链接。如果您在项目中使用 jQuery,则需要考虑使用$.post。 -
我在局部视图中使用 html.beginform()。我应该将表单方法作为帖子放在此处吗?我认为我的操作方法帖子中的代码不正确,因为我的数据库应该更改/更新?
-
当您点击链接时,它是否真的点击了您的
LoanSearch方法?这可以追溯到我的第一条评论 - 你遇到的实际问题是什么?
标签: asp.net-mvc asp.net-mvc-5 viewmodel