2012-11-28 3 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(); 
} 

내 모델 별 저장소 (일반을 상속 함) :

뷰에 뷰 모델을로드

내 컨트롤러 :

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을 사용하여 VisitorLog 클래스의 직원 ID 대신 EmployeeName 값을 표시 할 수있었습니다. "에 대한리스트 가입자에 옵션으로 표시되지

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

하지만 Employees.EmployeeName 위의 예 : 그러나 나는 또한 컨트롤러 내 저장소 호출에 직원 이름으로 검색 할 수 있도록하려면 V".

도움을 주시면 감사하겠습니다.

답변

1

이 모양은 단지 오타 일 수도 있습니다. 클래스의 탐색 속성은입니다. Employees이 아니라 Employee입니다. 다음이 효과가 있습니까?

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

이 경우보기에서 동일한 작업을 수행했습니다.

+0

DOH !!! 그랬어! 감사! – steveareeno