使用 PagedList.MVC 时无法使用强类型视图
Unable to use strongly-typed views when using 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' does not contain a definition for 'user' and no extension method 'user' accepting a first argument of type 'IPagedList' could be found (are you missing a using directive or an assembly reference?)
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; }
}
如果您同时需要(用于创建新用户的文本框和用于用户列表的用户列表),您应该使用这两个属性创建一个新的视图模型
public class CreateAndListVm
{
public string UserId {set;get;}
public IPagedList<CDS.Models.UserModel> Users {set;get;}
}
现在从您的创建操作,而不是 return 分页列表,return 此视图模型的对象。您应该在 returning 之前加载 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>
当只使用@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' does not contain a definition for 'user' and no extension method 'user' accepting a first argument of type 'IPagedList' could be found (are you missing a using directive or an assembly reference?)
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; }
}
如果您同时需要(用于创建新用户的文本框和用于用户列表的用户列表),您应该使用这两个属性创建一个新的视图模型
public class CreateAndListVm
{
public string UserId {set;get;}
public IPagedList<CDS.Models.UserModel> Users {set;get;}
}
现在从您的创建操作,而不是 return 分页列表,return 此视图模型的对象。您应该在 returning 之前加载 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>