我正在尝试创建一个搜索页面,它根据用户名搜索用户的详细信息。我的问题是我无法为搜索框创建强类型文本框。我创建了一个模型视图,尽管我无法解决我的问题。我的视图甚至不能正确编译,我猜我与绑定视图使其强类型的模型出错了。我希望有2个用户名和电话号码的文本框,如果用户在文本框内输入任何东西,它应该返回匹配的用户配置文件。
这是视图模型:
public class UserSearchViewModel
{
public string userName { get; set; }
public string phoneNum { get; set; }
public IEnumerable<User> user { get; set; }
}
操作方法:
public ActionResult Search(UserSearchViewModel mod)
{
IEnumerable<User> u1 = null;
u1 = db.Users.Where(p => p.UserName.Contains(mod.userName) || p.PhoneNum.Contains(mod.phoneNum));
return View(u1);
}
视图:
@model HindiMovie.Models.UserSearchViewModel
@using( Html.BeginForm("Search", "User", FormMethod.Get))
{
@Html.TextBox("UserName")
}
<table>
<tr>
<th>@Html.DisplayNameFor(model => model.UserName)</th>
<th>@Html.DisplayNameFor(model => model.FirstName)</th>
<th>@Html.DisplayNameFor(model => model.LastName)</th>
<th>@Html.DisplayNameFor(model => model.PhoneNum)</th>
<th></th>
</tr>
@foreach (var item in Model.user) {
<tr>
<td>@Html.DisplayFor(modelItem => item.FirstName)</td>
<td>@Html.DisplayFor(modelItem => item.LastName)</td>
<td>@Html.DisplayFor(modelItem => item.UserName)</td>
</tr>
}
</table>
方法之一是创建一个包装器类
public class UserSearchViewModel
{
public string UserName {get;set;}
public string PhoneNumber {get;set;}
public IEnumerable<User> Users {get;set;}
}
模型将是UserSearchViewModel而不是IEnumerable,你的foreach将循环通过模型。用户代替模型
这篇文章和这篇文章详细介绍了ViewModels(一个专为视图提供数据而存在的任意类)与直接在视图中使用实体/数据库模型的区别。
在form元素中,使用
@Html.TextBoxFor(m => m.userName )
@Html.TextBoxFor(m => m.phoneNum)
但是你的视图不会编译的原因是因为你的模型不包含属性UserName
, FirstName
等,所以你不能在你的表标题中使用@Html.DisplayNameFor(m => m.UserName)
。
硬编码
<th>User name</th>
或
<th>@Html.DisplayNameFor(m => m.user.FirstOrDefault().UserName)</th>
注意,集合不需要包含任何项,