简体   繁体   中英

The model item passed into the ViewDataDictionary

Hi I have problem in my code and it seems it has something to do with the instances but I declare already a instance in the controller and it seems it is not working.

I got this error:

InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[PEMCOLoan.DAL.Entities.spModels.spGetLedger]', but this ViewDataDictionary instance requires a model item of type 'PEMCOLoan.Web.Models.Ledger'.

Controller

[HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult getEmployeeLedger(spGetLedger ledger)
    {
        var firstDay = _Context.LoanPayments.Min(min => min.DateOfPayment);
        var lastDay = _Context.LoanPayments.Max(max => max.DateOfPayment);

        //Set Test data

        //Set Parameter
        var StartDate = new SqlParameter("StartDate", firstDay);
        var EndDate = new SqlParameter("EndDate", lastDay);
        var EmpID = new SqlParameter("EmployeeID", ledger.EmployeeID);
        var LoanTypeID = new SqlParameter("LoanType", ledger.LoanTypeID);

        Ledger newLedger = new Ledger();

        newLedger.enumledger = _Context.Set<spGetLedger>().FromSql("EXECUTE spGetLedger @EmployeeID, @LoanType, @StartDate, @EndDate", EmpID, LoanTypeID, StartDate, EndDate).AsNoTracking();
        //var empLedger = _Context.getLedger
        return View(newLedger.enumledger);
    }

Views

 @model PEMCOLoan.Web.Models.Ledger @{ ViewBag.Title = "Ledger"; } <h2>View @Model.ledger.FullName's Ledger</h2> <h3>Loan Name: @Model.ledger.LoanName</h3> <h3>Total Loan Amount: @Model.ledger.TotalLoanAmount</h3> @if (Model.enumledger.Any()) { <table class="table table-responsive"> <tr> <th>Date Paid</th> <th>Principal Amount</th> <th>Interest</th> <th>Total</th> </tr> @foreach(var item in Model.enumledger) { <tr> <td>@Html.DisplayFor(modelItem => item.PaymentDate)</td> <td>@Html.DisplayFor(modelItem => item.TotalLoanAmount)</td> <td>@Html.DisplayFor(modelItem => item.Interest)</td> <td>@Html.DisplayFor(modelItem => item.Total)</td> </tr> } </table> } <h3>Balance: @Model.ledger.Balance</h3> 

AsNoTracking returns IQueryable. Change it to .AsNoTracking().ToList() to force the retrieval at that point.

you need to add .ToList() :

Ledger newLedger = new Ledger();

newLedger.enumledger = _Context.Set<spGetLedger>().FromSql("EXECUTE spGetLedger @EmployeeID, @LoanType, @StartDate, @EndDate", EmpID, LoanTypeID, StartDate, EndDate).AsNoTracking().ToList();

return View(newLedger.enumledger);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM