2012-04-26 3 views
0

현재 선택된 아이템 ID를 확인하고 편집 페이지의 드롭 다운리스트에 이전 선택된 아이템을 표시하려고합니다. 항목은 활성 상태를 기반으로 표시됩니다. 모든 활성 항목이 드롭 다운에 표시되고 사용자에 대한 이전 선택 선택 사항이 현재 비활성 상태 인 경우 이전에 선택한 항목이므로 드롭 다운 목록에서 해당 항목을 기본값으로 사용해야합니다. 내 문제는 내가 편집 페이지에서 사용자가 선택한 비활성 항목을 표시 할 수 없다는 것입니다. 내 모든 코드를 게시 할 예정이 다른 링크 질문 질문의 연속이다 : CONTROLLER에 passing null parameters체크리스트 아이템 ID

내 코드 : CONTROLLER에

private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel viewModel = null) 
{ 
    if(viewModel == null) 
     viewModel = new AppointmentViewModel(); 
    IOrderedQueryable<ItemDescription> items= _itemDescriptionRepository.FindAll().OrderBy(
     c => c.Sort == null).ThenBy(
      c => c.Sort).ThenBy(c => c.Description); 

    if(items.Count()==0) 
     ModelState.AddModelError("", string.Format("No active {0} entered.", Kids.Resources.Entities.ItemDescription.EntityNamePlural)); 
    return 
     _itemDescriptionRepository.FindAll().OrderBy(c => c.Description).Where(a=>a.IsActive == true || a.ItemDescriptionId == viewModel.ItemDescriptionId).Select(
      c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()}); 
} 

내 편집 방법 :

[HttpGet] 
    [AppointmentAuthorization] 
    public ActionResult Edit(Guid appointmentId) 
    { 
     Appointment appointment = _appointmentService.Get(appointmentId); 
     if (appointment == null) return View("NotFound"); 


     var viewModel = new AppointmentViewModel 
          { 
           AppointmentId = appointment.AppointmentId, 

          }; 
     viewModel.Items= GetItems(); 

     return this.RazorView("Edit", viewModel); 
    } 

무언가가 누락되어 viewModel을 매개 변수로 전달하는 것처럼 보입니다. viewModel.Items = GetItems()가별로하지 않았습니다. 또한 편집을위한 다른 Post 메서드와 CreateItems() 메서드를 호출하는 Create 메서드가 있습니다. 어떤 도움이 될 것입니다. 감사합니다 :

public IEnumberable<SearchItems> Items {get; set;} 
public Guid ItemDescriptionid {get; set;} 

작성 방법 :

[HttpGet] 
    [AppointmentAuthorization] 
    public ActionResult Create(Guid caseId) 
    { 
     var viewModel = new AppointmentViewModel 
          { 
           Items= GetItems() 
          }; 

     return this.RazorView("Create", viewModel); 
    } 

***** 솔루션 *****

private IEnumerable<SearchItems> GetItems(Appointment appointment) 
    { 
     IEnumerable<short?> itemDescriptionIds = 
      appointment.AppointmentItems.Where(c => c.ItemDescriptionId.HasValue).Select(
       c => c.ItemDescriptionId).Distinct(); 

     IOrderedQueryable<ItemDescription> itemDescription = 
      _itemDescriptionRepository.FindAll().Where(
       a => a.IsActive == true || itemDescriptionIds.Contains(a.ItemDescriptionId)).OrderBy(
        d => d.Description); 

     return itemDescription.Select(c=> new SearchItems{Text = c.Description, Value = c.ItemDescriptionId.ToString()}); 
    } 
D

이 내가 내 뷰 모델 클래스에있는 것입니다

+0

viewModel에서 appointmentId를 초기화합니다. 이것은 오타입니까? ViewModel에 AppointmentId가 없다고합니다. – DMulligan

+0

내 나쁜 ... 나는 그것이 문제의 일부가 아니라고 생각하고 그것을 추가하지 않았다. startDate와 getItems를 다루지 않는 것들을 제거했습니다. 그러나 예 appointmentId가 초기화됩니다. – Masriyah

+1

내 요점은 당신이 당신의 viewmodel에있는 itemdescriptionid가 아니라 appointmentId를 설정했다는 것입니다. – DMulligan

답변

0

귀하의 inital 코드가 이전에 선택한 값을 쿼리하지 않은 이유는 귀하의 쿼리 a.ItemDescriptionId == viewModel.ItemDescriptionId이 항목 설명 ID , View Model에서는 약속 ID 만 설정합니다. 항목 설명 ID가 필요하면 초기화하십시오.

var viewModel = new AppointmentViewModel 
{ 
    AppointmentId = appointment.AppointmentId, 
    ItemDescriptionId = appointment.ItemDescriptionId 
}; 

하기 권장 리팩토링 :

private IEnumerable<SearchItems> GetItems(Guid lastId = new Guid()) 
{ 
    IOrderedQueryable<ItemDescription> items= _itemDescriptionRepository.FindAll(); 

    if(!items.Any()) 
     ModelState.AddModelError("", string.Format("No active {0} entered.", Kids.Resources.Entities.ItemDescription.EntityNamePlural)); 

    return items 
     .OrderBy(c => c.Description).Where(a=>a.IsActive == true || a.ItemDescriptionId == lastId) 
     .Select(c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()}); 
} 

그것은 당신이 그것을 사용하는 모든 필요한 GUID를 복용 할 때 뷰 모델에 전달하는 바보입니다. 그런 다음 호출하십시오

viewModel.Items= GetItems(appointment.ItemDescriptionId); 

올바른 항목을 추가하는 중입니다.

var testExists = itemDescriptionRepository.FindAll().FirstOrDefault(a.ItemDescriptionId == lastId); 

것은 당신이 그것을 발견하지 않는, 그리고 특정 lastId이 올바르게 설정되어 있다면, 아마 데이터베이스 문제입니다.

+0

난 그냥이 시도하고 이제 오류 페이지 진술 : 형식 'System.Guid'에서 'System.Int16'입력 변환 할 수 없습니다. – Masriyah

+0

어디서 오류가 있습니까? 귀하의 itemDescriptionId는 guid 또는 정수입니까? 코드가 올바르게 쿼리되지 않는 첫 번째 이유는 viewmodel에있는 appointmentId 만 설정 한 다음 항상 null/기본값 인 itemDescriptionId와 비교하는 것입니다. – DMulligan

+0

나는 그것이 itemDescriptionId가 항상 null이며 그저 내 머리를 감쌀 수 없다는 것이 문제라고 생각한다. 내가받은 오류 메시지는 내보기 페이지 .cshtml 파일에 빨간색 줄이 있습니다 : self.items = @ Html.Raw (Json.Encode (Model.Items)); – Masriyah