Невозможно использовать строго типизированные представления при использовании PagedList.MVC

При использовании только @model Project.Models.UserModel я вполне могу использовать TextBoxFor. Но при изменении его на @model PagedList.IPagedList<Project.Models.UserModel> я больше не могу использовать TextBoxFor.

Create.cshtml — я не могу использовать TextBoxFor без ошибки.

@model PagedList.IPagedList<Project.Models.UserModel>

...
//I'm having a problem with this code
@Html.TextBoxFor(model => model.userid)

...

«IPagedList» не содержит определения для «пользователя», и не удалось найти метод расширения «пользователь», принимающий первый аргумент типа «IPagedList» (вам не хватает директивы использования или ссылки на сборку?)

UserController.cs — я возвращаю PagedList

public ActionResult Create(string currentFilter, string searchString, int? page)
{
    if (searchString != null)
    {
        page = 1;
    }
    else
    {
        searchString = currentFilter;
    }

    ViewBag.CurrentFilter = searchString;
    var users = from ug in _odb.USR_MSTR
                     select new UserModel
                     {
                         userid = ug.USR_ID,
                         user = ug.USR_DESC,
                         status = (ug.INACTV_DT == null ? "Active" : "Inactive")
                     };

    int pageSize = 10;
    int pageNumber = (page ?? 1);

    ViewBag.UserFilter = GetSelectListItems();  

    return View(users.ToPagedList(pageNumber, pageSize));
}

public JsonResult Save_User(UserModel model)
{
    string _message = string.Empty;
    using (var _odb = new ProjectEntities())
    {
        try
        {
            USR_MSTR usr_master = new USR_MSTR();
            usr_master.USER_ID = Guid.NewGuid().ToString().Remove(20);
            usr_master.USER_DESC = model.user;
            usr_master.CREATE_DT = DateTime.Now;

            _odb.USR_MSTR.Add(usr_master);
            _odb.SaveChanges();
        }
        catch (Exception ex)
        {
            _message = "An error occured.";
            _message = ex.InnerException.Message;
        }
    }
    return Json(true);
}

UserModel.cs — здесь определены все мои текстовые поля

public class UserModel
{
    public string userId { get; set; }

    [Display(Name = "User")]
    public string user { get; set; }

    [Display(Name = "Status")]
    public string status { get; set; }

    [Display(Name = "Filter Search By")]
    public int filterSearchBy { get; set; }

    public int filterSearchText { get; set; }
}

person Harambe Attack Helicopter    schedule 12.08.2016    source источник


Ответы (1)


Если вы хотите оба (текстовое поле для создания нового пользователя и список пользователей для списка пользователей), вы должны создать новую модель представления с этими двумя свойствами

public class CreateAndListVm
{
  public string UserId {set;get;}
  public IPagedList<CDS.Models.UserModel> Users {set;get;}
}

Теперь из действия «Создать» вместо возврата постраничного списка верните объект этой модели представления. Вы должны загрузить значение свойства Users перед возвратом.

var vm = new CreateAndListVm();
vm.Users = users.ToPagedList(pageNumber, pageSize);
return View(vm);

Теперь ваше представление должно быть строго типизировано для этой новой модели представления. Вы можете использовать свойство Model.Users для отображения списка пользователей.

@model CreateAndListVm
@using(Html.BeginForm())
{
   <label>New User Id</label>
   @Html.TextBoxFor(s=>s.UserId)
   <input type="submit" />
}
<table>
@foreach (var item in Model.Users)
{
    <tr>
        <td>@item.UserId</td>                     
    </tr>
}    
</table>
person Shyju    schedule 12.08.2016
comment
Привет Шиджу, спасибо за ответ! Это действительно очень помогло мне понять, для чего на самом деле нужны ViewModels. Я также добавил в свой вопрос мой класс Model и метод JsonResult в классе Controller. Это потому, что я совсем запутался с вашей CreateAndListVm ViewModel. У него есть идентификатор пользователя. Не должно быть userId в Model? Потому что у меня уже есть один в моем Model - person Harambe Attack Helicopter; 12.08.2016
comment
Вы можете заменить userId любыми значениями свойств, необходимыми для создания нового пользователя. - person Shyju; 12.08.2016
comment
Просто хочу внести ясность: значит, в текстовых полях TextBoxFor используются переменные, определенные в CreateAndListVM, верно? Например, UserId и т. д. Затем отображение записей осуществляется путем доступа к набору IPagedList<CDS.Models.UserModel> Users в CreateAndListVM? - person Harambe Attack Helicopter; 15.08.2016
comment
да. Когда вы публикуете форму (для создания новой записи), вы также можете использовать ту же модель представления, что и ваш параметр, и прочитать значение UserId/WhateverPropertyNameYouWant и использовать его для сохранения в БД. - person Shyju; 15.08.2016