【问题标题】:Implement and populate view model db first首先实现和填充视图模型数据库
【发布时间】: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


【解决方案1】:

你可以这样做:

表格:

USE [Breaz]
GO

/****** Object:  Table [dbo].[Loan]    Script Date: 6/26/2017 11:15:15 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Loan](
    [LoanId] [int] IDENTITY(1,1) NOT NULL,
    [ISBN] [varchar](20) NULL,
    [Name] [varchar](20) NULL,
    [Author] [varchar](20) NULL,
    [FinePrice] [money] NOT NULL,
 CONSTRAINT [PK_Loan] PRIMARY KEY CLUSTERED 
(
    [LoanId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

控制器

public class HomeController : Controller
{
    [HttpGet]
    public PartialViewResult LoanSearchByIdAndUpdate(int id)
    {
        //DO your database update here
        //I will change the find to 2.37
        Loan loan = new Loan();
        var bookName = String.Empty;
        using (BreazEntities26 db = new BreazEntities26())
        {
            loan = db.Loans.Find(id);
            loan.FinePrice = 2.37M;
            bookName = loan.Name;
        }
        IList<Loan> loans = new List<Loan>();
        loans.Add(loan);
        return PartialView("_LoanSearch", loans););
    }

    [HttpGet]
    public PartialViewResult LoanSearch(string q)
    {
        var loans = GetLoans(q);

        return PartialView("_LoanSearch", loans););
    }

    private List<Loan> GetLoans(string searchString)
    {
        using (BreazEntities26 db = new BreazEntities26())
        {
            return db.Loans
           .Where(a => a.Name.Contains(searchString))
           .ToList();
        }
    }

IndexValid2.cshtml

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>IndexValid2</title>
    <script src="~/Scripts/jquery-1.12.4.min.js"></script>
    @*MAKE SURE to put the next script in*@
    <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $('#passSearchValue').click(function () {
                var searchValue = $('#q').val();
                this.href = this.href + '?q=' + encodeURIComponent(searchValue);
            });
        })
    </script>
</head>
<body>
    <div>
        Search for book:
        @Html.TextBox("q", null, new { id = "q" })
        @*https://stackoverflow.com/questions/5838273/actionlink-routevalue-from-a-textbox*@
        @Ajax.ActionLink(
                               "Search",
                                "LoanSearch",
                                   null,
                                   new AjaxOptions
                                    {
                                        UpdateTargetId = "result",
                                        InsertionMode = InsertionMode.Replace,
                                        HttpMethod = "GET"
                                    },
                                    new { id = "passSearchValue" })
    </div>
    <div id="result"></div>
</body>
</html>

共享中的部分视图,_LoanSearch.cshtml

@model IEnumerable<Testy20161006.Models.Loan>
@foreach (var item in Model)
{
    <ul>
        <li>@item.ISBN</li>
        <li>@item.Name</li>
        <li>@item.Author</li>

        <li> @item.FinePrice</li>
    </ul>
    @Html.ActionLink("Update", "LoanSearchByIdAndUpdate", new { id = item.LoanId });
    <p />
    @Html.ActionLink("Return to Search", "IndexValid2");
}

【讨论】:

    猜你喜欢
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多