Search code examples
asp.net-mvcviewmodelasp.net-mvc-partialview

The Model Passed to Dictionary is of one type whereas the Dictionary Requires Model Item of Type ViewModels


I am working with the partial views to attain a functionality in which I have to delete data from two tables having a one to many relationship in database. For this, I am using same “Delete” function in controller for both tables. I have added two models for these tables in the Delete view using ViewModels and have rendered both partial views in the main Delete Page to display relevant data on each delete view but after doing all this coding I am getting the following error.

The model item passed into the dictionary is of type 'System.Data.Entity.DynamicProxies.tblPatientBill_804486DE0CB5E4B1C416CFC35E7B001C20B1FDB3674F40F1811012FFC9BAA908', but this dictionary requires a model item of type 'HMS.ViewModels.DeleteViewModel'.

Here is my Code Details:

PatientsBillController:

 public ActionResult Delete(int? id,DeleteViewModel model)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            PatientsBillViewModel billmodell = new PatientsBillViewModel();
            PatientsBillDetailViewModel billdetailmodell = new PatientsBillDetailViewModel();

            tblPatientBill bill = db.tblPatientBills.Find(id);
            tblPatientBillDetail billdetail = db.tblPatientBillDetails.Find(id);

            if (billdetail == null)
            {
                if (bill == null)
                {
                    return HttpNotFound();
                }
                else
                {

                    billmodell.ID = bill.ID;
                    billmodell.PatientAppointmentID = bill.PatientAppointmentID;
                    billmodell.BillNo = bill.BillNo;
                    billmodell.Amount = bill.Amount;
                    billmodell.Discount = bill.Discount;
                    billmodell.CreatedAt = bill.CreatedAt;
                    billmodell.CreatedBy = bill.CreatedBy;
                    billmodell.Description = bill.Description;
                    return View(billmodell);
                }
            }
            else
            {
                billdetailmodell.ID = billdetail.ID;
                billdetailmodell.PatientBillID = billdetail.PatientBillID;
                billdetailmodell.Amount = billdetail.Amount;
                billdetailmodell.CreatedAt = billdetail.CreatedAt;
                billdetailmodell.CreatedBy = billdetail.CreatedBy;
                billdetailmodell.Description = billdetail.Description;
                return View(billdetail);
            }

        }

Delete.cshtml:

@using HMS.ViewModels
@model HMS.ViewModels.DeleteViewModel

@{
    ViewBag.Title = "Delete";
    Layout = null;
}

@{Html.RenderPartial("PatientsBillDelete", Model); }
@{Html.RenderPartial("PatientsBillDetail", Model); }

ViewModel.cs:

public class DeleteViewModel
    {
        public  PatientsBillViewModel billmodel { set; get; }
        public PatientsBillDetailViewModel billdetailmodel { set; get; }

    }

  public class PatientsBillViewModel
    {
        public int ID { get; set; }
        public int PatientAppointmentID { get; set; }
        public string BillNo { get; set; }
        public float Amount { get; set; }
        public float Discount { get; set; }
        public string CreatedAt { get; set; }
        public string CreatedBy { get; set; }
        public string Description { get; set; }
    }

    public class PatientsBillDetailViewModel
    {
        public int ID { get; set; }
        public int PatientBillID { get; set; }
        public float Amount { get; set; }
        public string CreatedAt { get; set; }
        public string CreatedBy { get; set; }
        public string Description { get; set; }
    }

PartialViews are:

PatientBillDelete.cshtml

PatientBillDetail.cshtml

PatientBillDelete.cshtml:

@using HMS.ViewModels
@model HMS.ViewModels.DeleteViewModel
@{
    ViewBag.Title = "PatientsBill Delete";
}

<section class="content">
    <div class="container-fluid">
        <div class="block-header">
            <h2>Delete</h2>
        </div>
        <div class="row clearfix">
            <div class="col-lg-12 col-md-12 col-sm-12">
                <div class="card">
                    <h3>Are You Sure You Want To Delete This?</h3>
                    <div class="body">
                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(m => m.billmodel.ID)
                                        <br />
                                        @Html.DisplayFor(m => m.billmodel.ID)
                                    </div>
                                </div>
                            </div>
                        </div>

                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(m => m.billmodel.PatientAppointmentID)
                                        <br />
                                        @Html.DisplayFor(m => m.billmodel.PatientAppointmentID)
                                    </div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">

                                        @Html.DisplayNameFor(m => m.billmodel.BillNo)
                                        <br />
                                        @Html.DisplayFor(m => m.billmodel.BillNo)
                                    </div>
                                </div>
                            </div>
                        </div>

                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(m => m.billmodel.Amount)
                                        <br />
                                        @Html.DisplayFor(m => m.billmodel.Amount)
                                    </div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(m => m.billmodel.Discount)
                                        <br />
                                        @Html.DisplayFor(m => m.billmodel.Discount)
                                    </div>
                                </div>
                            </div>
                        </div>

                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(m => m.billmodel.CreatedAt)
                                        <br />
                                        @Html.DisplayFor(m => m.billmodel.CreatedAt)
                                    </div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(m => m.billmodel.CreatedBy)
                                        <br />
                                        @Html.DisplayFor(m => m.billmodel.CreatedBy)
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(m => m.billmodel.Description)
                                        <br />
                                        @Html.DisplayFor(m => m.billmodel.Description)
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                @using (Html.BeginForm())
                                {
                                    @Html.AntiForgeryToken()

                                    <div class="form-actions no-color">
                                        @Html.HiddenFor(m => m.billmodel.ID)
                                        <input type="submit" value="Delete" class="btn btn-default" /> |
                                        @Html.ActionLink("Back to List", "EditBill")
                                    </div>
                                }
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>

PatientsBillDetail.cshtml

@using HMS.ViewModels
@model HMS.ViewModels.DeleteViewModel
@{
    ViewBag.Title = "PatientsBill Delete";
}

<section class="content">
    <div class="container-fluid">
        <div class="block-header">
            <h2>Delete</h2>
        </div>
        <div class="row clearfix">
            <div class="col-lg-12 col-md-12 col-sm-12">
                <div class="card">
                    <h3>Are You Sure You Want To Delete This?</h3>
                    <div class="body">
                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(model => model.billdetailmodel.ID)
                                        <br />
                                        @Html.DisplayFor(model => model.billdetailmodel.ID)
                                    </div>
                                </div>
                            </div>
                        </div>

                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(model => model.billdetailmodel.PatientBillID)
                                        <br />
                                        @Html.DisplayFor(model => model.billdetailmodel.PatientBillID)
                                    </div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(model => model.billdetailmodel.Amount)
                                        <br />
                                        @Html.DisplayFor(model => model.billdetailmodel.Amount)
                                    </div>
                                </div>
                            </div>
                        </div>

                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(model => model.billdetailmodel.CreatedAt)
                                        <br />
                                        @Html.DisplayFor(model => model.billdetailmodel.CreatedAt)
                                    </div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(model => model.billdetailmodel.CreatedBy)
                                        <br />
                                        @Html.DisplayFor(model => model.billdetailmodel.CreatedBy)
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                <div class="form-group">
                                    <div class="form-line">
                                        @Html.DisplayNameFor(model => model.billdetailmodel.Description)
                                        <br />
                                        @Html.DisplayFor(model => model.billdetailmodel.Description)
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="row clearfix">
                            <div class="col-sm-6 col-md-6 col-lg-6">
                                @using (Html.BeginForm())
                                {
                                    @Html.AntiForgeryToken()

                                    <div class="form-actions no-color">
                                        @Html.HiddenFor(model => model.billdetailmodel.ID)
                                        <input type="submit" value="Delete" class="btn btn-default" /> |
                                        @Html.ActionLink("Back to List", "EditBill")
                                    </div>
                                }
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>

I think there is problem with my controller logic how can I look for different ids passed in the Delete function and check in two different table and pass result to viewmodel? Please tell me what I am doing wrong in it. Thanks in advance


Solution

  • You are actually returning returning wrong object to your View. You should be passing the DeleteViewModel object back to your View something like :

    DeleteViewModel deleteViewModel = new DeleteViewModel ();
    deleteViewModel.billmodell = billmodell;
    deleteViewModel.billdetailmodel = billdetailmodell;
    

    and then pass it in your View() method call:

    return View(deleteViewModel);
    

    Your code after loading records from db should be like:

    DeleteViewModel deleteViewModel = new DeleteViewModel();
    deleteViewModel.billmodell = new PatientsBillViewModel(); ;
    deleteViewModel.billdetailmodel = new PatientsBillDetailViewModel();
    
    
    tblPatientBill bill = db.tblPatientBills.Find(id);
    tblPatientBillDetail billdetail = db.tblPatientBillDetails.Find(id);
    
    
    if (bill != null)
    {
        deleteViewModel.billmodell.ID = bill.ID;
        deleteViewModel.billmodell.PatientAppointmentID = bill.PatientAppointmentID;
        deleteViewModel.billmodell.BillNo = bill.BillNo;
        deleteViewModel.billmodell.Amount = bill.Amount;
        deleteViewModel.billmodell.Discount = bill.Discount;
        deleteViewModel.billmodell.CreatedAt = bill.CreatedAt;
        deleteViewModel.billmodell.CreatedBy = bill.CreatedBy;
        deleteViewModel.billmodell.Description = bill.Description;
    }
    if(billdetail != null)
    {
        deleteViewModel.billdetailmodel.ID = billdetail.ID;
        deleteViewModel.billdetailmodel.PatientBillID = billdetail.PatientBillID;
        deleteViewModel.billdetailmodel.Amount = billdetail.Amount;
        deleteViewModel.billdetailmodel.CreatedAt = billdetail.CreatedAt;
        deleteViewModel.billdetailmodel.CreatedBy = billdetail.CreatedBy;
        deleteViewModel.billdetailmodel.Description = billdetail.Description;
    
    }
    
    return View(deleteViewModel);