2012-11-28 56 views
1

我有一個模型:MVC視圖模型和導航屬性

public partial class VisitorLog 
{ 
    public int Id { get; set; } 
    public string VisitorName { get; set; } 
    public DateTime TimeIn { get; set; } 
    public DateTime TimeOut { get; set; } 
    public string CompanyName { get; set; } 
    public string EmployeeID { get; set; } 
    public string VisitReason { get; set; } 

    // Navigation properties 
    [ForeignKey("EmployeeID")] 
    public virtual Employee Employee { get; set; } 
} 

一個通用存儲庫:

public class GenericRepository<C, T> : IGenericRepository<T> where T : class where C : DbContext, new() 
{ 
    private C _entities = new C(); 
    public C Context 
    { 
     get { return _entities; } 
     set { _entities = value; } 
    } 

    public virtual IQueryable<T> GetAll() 
    { 
     IQueryable<T> query = _entities.Set<T>(); 
     return query; 
    } 

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate) 
    { 
     IQueryable<T> query = _entities.Set<T>().Where(predicate); 
     return query; 
    } 

    public virtual void Add(T entity) 
    { 
     _entities.Set<T>().Add(entity); 
    } 

    public virtual void Delete(T entity) 
    { 
     _entities.Entry(entity).State = System.Data.EntityState.Deleted; 
    } 

    public virtual void Edit(T entity) 
    { 
     _entities.Entry(entity).State = System.Data.EntityState.Modified; 
    } 

    public virtual void Save() 
    { 
     _entities.SaveChanges(); 
    } 
} 

爲通用信息庫的接口:

public interface IGenericRepository<T> where T : class 
{ 
    IQueryable<T> GetAll(); 
    IQueryable<T> FindBy(Expression<Func<T, bool>> predicate); 
    void Add(T entity); 
    void Delete(T entity); 
    void Edit(T entity); 
    void Save(); 
} 

我的具體模型庫(繼承通用):

public class VisitorLogRepository : GenericRepository<VisitorLogDBContext, VisitorLog>, IVisitorLogRepository { 

    public VisitorLog GetSingle(int id) 
    { 
     var query = GetAll().FirstOrDefault(x => x.Id == id); 
     return query; 
    } 
} 

public class SearchViewModel 
{ 
    public IEnumerable<VisitorLog> VisitorLogs { get; set; } 
} 

我的控制器被加載視圖模型到視圖:

var searchViewModel = new SearchViewModel 
{ 
    VisitorLogs = iVisitorlogRepository.FindBy(v => v.VisitorName.Contains(searchText) 
     || v.CompanyName.Contains(searchText) 
     || v.EmployeeID.Contains(searchText)), 
}; 

,最後我的看法:

@model VisitorLogApp.ViewModels.SearchViewModel 

@foreach (var item in ViewData.Model.VisitorLogs) { 
    <tr> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | 
      @Html.ActionLink("Details", "Details", new { id=item.Id }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
     </td> 
     <td> 
      @item.VisitorName 
     </td> 
     <td> 
      @item.CompanyName 
     </td> 
     <td> 
      @item.Employees.EmployeeName 
     </td> 
     <td> 
      @String.Format("{0:g}", item.TimeIn) 
     </td> 
     <td> 
      @String.Format("{0:g}", item.TimeOut) 
     </td> 
     <td> 
      @item.VisitReason 
     </td> 
    </tr> 

一切都與一個異常偉大的工作。該視圖顯示訪問者列表(VisitorLog)。使用導航屬性,我可以通過簡單地使用@ item.Employees.EmployeeName來獲得EmployeeName值,而不是VisitorLog類中的員工ID。不過,我也希望能夠在控制器在我的倉庫通話員工姓名搜索:

VisitorLogs = iVisitorlogRepository.FindBy(v => v.VisitorName.Contains(searchText) 
|| v.CompanyName.Contains(searchText) 
|| v.Employees.EmployeeName.Contains(searchText)), 

Employees.EmployeeName在上面的例子中沒有顯示在列表成員「選項v」。

任何幫助表示讚賞。

回答

1

看起來像這可能只是一個錯字 - 您的班級中的導航屬性被稱爲Employee,而不是Employees。以下工作?

VisitorLogs = iVisitorlogRepository.FindBy(
    v => v.VisitorName.Contains(searchText) 
    || v.CompanyName.Contains(searchText) 
    || v.Employee.EmployeeName.Contains(searchText)), 

如果這是原因,您在視圖中做了同樣的事情。

+0

DOH !!!那樣做了!謝謝! – steveareeno