【问题标题】:Unable to use strongly-typed views when using PagedList.MVC使用 PagedList.MVC 时无法使用强类型视图
【发布时间】:2016-08-12 03:49:42
【问题描述】:

当只使用@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”不包含“user”的定义,并且找不到接受“IPagedList”类型的第一个参数的扩展方法“user”(您是否缺少 using 指令或程序集引用?)

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; }
}

【问题讨论】:

    标签: c# asp.net-mvc pagedlist


    【解决方案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>
    

    【讨论】:

    • 嗨Shyju,感谢您的回复!它确实帮助我弄清楚了 ViewModel 的真正用途。我还在我的问题中添加了我的Model 类和Controller 类中的JsonResult 方法。这是因为我对您的CreateAndListVm ViewModel 感到很困惑。它有用户 ID。 Model 中的 userId 不应该是?因为我的Model 已经有一个了
    • 您可以将 userId 替换为创建新用户所需的任何属性值。
    • 只是想清楚一点:所以TextBoxFor 文本框使用CreateAndListVM 中定义的变量对吗?比如UserId等。然后显示记录是通过访问CreateAndListVM中设置的IPagedList&lt;CDS.Models.UserModel&gt; Users来完成的?
    • 是的。当您发布表单(用于创建新记录)时,您还可以使用与参数相同的视图模型并读取 UserId/WhateverPropertyNameYouWant 值并将其保存到数据库。
    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多