Представление ожидает для модели представления, в то время как элемент списка был передан в контроллер - PullRequest
0 голосов
/ 04 апреля 2019

Error ::

Элемент модели, передаваемый в словарь, имеет тип 'System.Collections.Generic.List`1 [ProjDAL.Models.ViewModels.EmpViewModel]', но для этого словаря требуется элемент модели типа 'ProjDAL.Models.ViewModels. EmpViewModel.

Я работаю над приложением MVC. Для одного представления, которое в основном имеет функциональность для поиска нескольких параметров. Я использую одно и то же представление для метода get и post ... Это означает, что я передаю 1 или более параметров в текстовые поля и извлекаю результат, используя linq и сопоставляя его с таблицей данных. После передачи параметров значения отправляются в контроллер и извлекают точный результат, используя linq, но проблема возникает, когда я пытаюсь сопоставить набор результатов linq с моим представлением.

Вот код для проекта -

Контроллер -

[HttpPost]
        public ActionResult EmpSearch([Bind(Include = "employee,EmpID,PAN")] Get_EmpDetails_Result  get_EmpDetails_Result)
        {

            var result = from emp in dbCollections.Employees
                         join nat in dbCollections.NationalID on emp.EmpID equals nat.EmpID
                         select new EmpViewModel   
                         {
                             PAN = nat.pan,
                             EmpID = emp.EmpID,
                             employee = emp.Name
                         };

            var searchRes = result
                            .Where(s => s.PAN.Contains(get_EmpDetails_Result.pan)
                                     || s.EmpID.Contains(get_EmpDetails_Result.empid)
                                     || s.employee.Contains(get_EmpDetails_Result.employee));

            var modelSys = searchRes.ToList();
            return View(modelSys);
        }

Просмотр ::::

@model NewProjDAL.Models.ViewModels.EmpViewModel
@{
    ViewBag.Title = "empDetails";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
//////////// this part is for the multiple criteria search 
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()


    <div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            <label>By EmpID</label>
            <div class="col-md-10">
                @Html.EditorFor(model => model.GetEmpDetails.FirstOrDefault().empid, new { htmlAttributes = new { @class = "form-control" } })
            </div>
        </div>

        <div class="form-group">
            <label>By PAN</label>
            <div class="col-md-10">
                @Html.EditorFor(model => model.GetEmpDetails.FirstOrDefault().pan, new { htmlAttributes = new { @class = "form-control" } })
            </div>
        </div>

        <div class="form-group">
            <label>By Name</label>
            <div class="col-md-10">
                @Html.EditorFor(model => model.GetEmpDetails.FirstOrDefault().employee, new { htmlAttributes = new { @class = "form-control" } })
            </div>
        </div>

        <div class="form-actions center">
            <button type="submit" data-animation="pulse" class="btn btn-lg font-medium-1 btn-outline-teal mb-1 block-multiple-msgs buttonAnimation">
                <i class="fa fa-check-square-o"></i> Go
            </button>
        </div>

    </div>
}

//////////////////////////////this part is to fetch the result of the previously mentioned multiple search

                        @if (Model.EmpDetails.Count != 0)
                        {
                            <div class="table-responsive">
                                <table class="table table-striped table-bordered dom-jQuery-events compact" id="DataTbl">
                                    <thead class="navbar-dark navbar-dark bg-blue-grey white">
                                        <tr>
                                            <th>
                                                employee
                                            </th>
                                            <th>
                                                PAN
                                            </th>
                                            <th>
                                                empid
                                            </th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        @foreach (var item in Model.GetEmpDetails)
                                        {
                                            <tr>
                                                <td>
                                                    @Html.DisplayFor(modelItem => item.employee)
                                                </td>
                                                <td>
                                                    @Html.DisplayFor(modelItem => item.PAN)
                                                </td>
                                                <td>
                                                    @Html.DisplayFor(modelItem => item.empid)
                                                </td>
                                            </tr>
                                        }
                                    </tbody>
                                </table>
                            </div>
                        }

1 Ответ

0 голосов
/ 05 апреля 2019

В нем точно сказано, в чем проблема.Вы настроили представление для принятия единственного EmpViewModel в качестве модели, но ваш контроллер передает список

Вам необходимо создать модель представления для представления критериев поиска и результатов

public class EmployeeSearchViewModel
{
    public string EmpId { get; set; }
    public string PAN { get; set; }
    public string Employee { get; set; }

    public List<EmpViewModel> Employees { get; set; } = new List<EmpViewModel>();
}

затем в методе вашего контроллера:

var modelSys = searchRes.ToList();
var viewModel = new EmployeeSearchViewModel 
{
    PAN = get_EmpDetails_Result.pan,
    EmpId = get_EmpDetails_Result.empid,
    Employee = get_EmpDetails_Result.employee
    Employees = modelSys
};
return View(viewModel);

В представлении:

@Model EmployeeSearchViewModel

Тогда для отображения ваших параметров не нужно извлекать EmpID, PAN и т. Д. Изколлекции, только из модели представления, и вы можете связать свои повторяющиеся результаты с внутренней коллекцией "Сотрудники".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...