创建强类型视图

时间:2015-09-15 17:50:10

标签: asp.net-mvc entity-framework

我正在尝试创建一个搜索页面,该页面根据用户名搜索用户的详细信息。我的问题是我无法为搜索框创建强类型文本框。我创建了一个模型视图,尽管我无法修复我的问题。我的视图甚至无法正确编译,我猜我错误的模型绑定视图使其强类型。我希望有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>

2 个答案:

答案 0 :(得分:0)

一种方法是创建一个包装类

public class UserSearchViewModel
{
     public string UserName {get;set;}
     public string PhoneNumber {get;set;}
     public IEnumerable<User> Users {get;set;}
}

模型将是UserSearchViewModel而不是IEnumerable,你的foreach将循环通过Model.Users而不是Model。

Thisthis是一些文章,详细介绍ViewModels(一个专门用于为视图提供数据的任意类)的使用,而不是直接在视图中使用您的Enity / Database模型。

答案 1 :(得分:0)

在表单元素中,使用

@Html.TextBoxFor(m => m.userName )
@Html.TextBoxFor(m => m.phoneNum)

但是您查看不会编译的原因是因为您的模型不包含属性UserNameFirstName等,因此您不能在表格标题中使用@Html.DisplayNameFor(m => m.UserName)

硬编码

<th>User name</th>

或使用

<th>@Html.DisplayNameFor(m => m.user.FirstOrDefault().UserName)</th>

请注意,该集合不需要包含任何可以使用的项目。