2017-01-17 1 views
0

즉, 외래 키를 통해 내 클래스의 "계층 적 트리"를 트래버스 할 수 있습니까?MVC에서 외래 키를 사용하여 여러 클래스/테이블을 이동하려면 어떻게해야합니까?

다음은 트리 및 연관의 그림입니다.

Here is a quick picture of the tree and associations.

나는 각각 내보기에서 테이블을 통해 루프합니다. 설문 조사 데이터와 카테고리 데이터는 쿼리 문자열에서 PK와 FK SurveyID를 참조 할 수 있기 때문에 쉽게 표시 할 수 있습니다. 그 시점을 지나서 CategoryID에서 SurveyID로 연결을 얻는 방법을 모르겠습니다. 여기

내보기

@using (Html.BeginForm("Save", "Surveys")) 
{ 

<div class="form-group"> 
    @Html.LabelFor(m => m.SurveyId) 
    @Html.TextBoxFor(m => m.Description, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(m => m.Description) 
</div> 
<div class="form-group"> 
      @for (int i = 0; i < Model.Categories.Count; i++) 
      { 
       <ul>@Html.TextBoxFor(m => m.Categories[i].Description, new { @class = "form-control" })</ul> 
       @Html.HiddenFor(m => m.Categories[i].CategoryId) 
       @*Here is where I attempted to loop the questions based on category*@ 
       @*@for (int j = 0; j < Model.Categories[i].Questions.Count(); j++)*@ 
       { 
        @Html.TextBoxFor(m => m.Questions[j].QuestionText) 
       } 
      } 
</div> 

    @Html.HiddenFor(m => m.User.Id) 
    @Html.HiddenFor(m => m.SurveyId) 
    @Html.AntiForgeryToken() 
    <button type="submit" class="btn btn-primary">Save</button> 
} 

I가 사용하여 시도이다 (INT의 J = 0; j를 < Model.Questions.Count(); J ++)

하지만 아무것도 와서 내가 가진 그것은 상관없이 일하지 않는다는 느낌.

내 생각에 문제는보기 내에 있지 않지만 컨트롤러 내에서 데이터를 가져 오는 방식에 있습니다. I는이 방법 또는 무엇을 포함 사용하기로되어있어 경우 여기

public ActionResult Edit(int id) 
    { 
     var survey = _context.Surveys.SingleOrDefault(c => c.SurveyId == id); 
     var categories = new List<Category>(); 
     categories = _context.Categories.Where(c => c.SurveyId == id).ToList(); 
     var questions = new List<Question>(); 
     //questions = _context.Questions.Include() 

     //var questions = new List<Question>(); 
     //questions = _context.Categories.Include(c => c.SurveyId == id).ToList(); 
     if (survey == null) 
      return HttpNotFound(); 

     var viewModel = new NewSurveyViewModel(survey) 
     { 
      Questions = questions, 
      Categories = categories 
     }; 
     return View("SurveyForm", viewModel); 
    } 

는 잘 모르겠지만, 난 종류와 설문 조사 ID의 사이의 관계를 해소하는 방법을 생각하고 거기에서 갈 수 없어 QuestionID를 사용합니다.

비교적 가까이 있습니까?

+0

더 빠른 것입니다. Entity Framework를 사용하는 경우 개체를로드하는 방법은 https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx를 참조하십시오. – JamieSee

+0

데이터가 왜 표시되지 않는지에 대한 열망적인로드가 있었지만 이제는 각 카테고리의 각 카테고리에 대한 모든 질문이 표시됩니다. – Nick

+0

우리가 올바른 길을 걷고있는 것처럼 보였으므로 대답으로 바뀌 었습니다. 업데이트가 필요한지 알려주세요. – JamieSee

답변

0

이것은 MVC 문제가 아닌 데이터 액세스 문제 일 수 있습니다. Entity Framework를 사용하는 경우 객체를로드하는 방법에 대해서는 Entity Framework Loading Related Entities을 참조하십시오.

또한 계층 구조를 유지해야하는 경우 질문을 viewModel에 별도로로드하지 마십시오. 질문을위한 TextBoxFor 호출은이를 활용해야합니다.

시도 @Html.TextBoxFor(m => m.Categories[i].Questions[j].QuestionText).

+0

나는 열망하는 적재 부분에 대한 답으로 표시 할 것입니다. 그 후 매번 한 레벨 아래로 움직이는 중첩 된 foreach 루프를 사용하여 데이터를 올바르게 표시 할 수있었습니다. 아래 코드는 내 대답을 게시했습니다. – Nick

0

JamieSee는 데이터를 표시하려면 먼저 여기에 표시된대로 열심히로드해야한다고 지적합니다. msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

거기부터 중첩 된 foreach 루프를 사용했습니다. 당신이보기 내에서이 쿼리를 사용하려면

<div class="form-group"> 
    @foreach (var category in Model.Categories.Where(q => q.SurveyId == Model.SurveyId)) 
    { 
     <ul>@Html.TextBoxFor(m => category.Description, new { @class = "form-control" })</ul> 
      @Html.HiddenFor(m => category.CategoryId) 

     foreach (var question in Model.Questions.Where(q => q.CategoryId == category.CategoryId)) 
     { 
      <ul>@Html.TextBoxFor(m => question.QuestionText, new { @class = "form-control" })</ul> 
       @Html.HiddenFor(m => question.QuestionId) 

      foreach (var answer in Model.Answers.Where(a => a.QuestionId == question.QuestionId)) 
      { 
       <ul>@Html.TextBoxFor(m => answer.AnswerText, new { @class = "form-control" })</ul> 
        @Html.HiddenFor(m => answer.AnswerId) 
      } 
     } 
    } 
</div> 
0
var db = new DBContext() // => this is your database context 

var result = from s in db.Surveys 
      select new { 
       survey = s, 
       categories = from c in db.Categories 
          where c.SurveyID = s.ID 
          select new { 
           category = c, 
           questions = from q in db.Questions 
              where q.CategoryID = c.ID 
              select new { 
               question = q, 
               answers = from a in db.Answers 
                 where a.QuestionID = q.ID 
                 select a 
              } // close the questions 
          } // close the categories 
      };// close the surveys 

return result; 

, 아웃 반환 결과로 사용할 수 있습니다; 또한 데이터 전송 클래스를 정의 할 필요가 없습니다.

그러나 컨트롤러 내부에서 어떤 동작이나 json 결과에서 돌아가고 싶다면; 모든 select 레벨에서 데이터 전송을 위해 클래스 객체를 사용해야합니다.

예를 들어 1 단계 DTO 클래스는 다음과 같을 수 있습니다.

public class SurveyDTO 
{ 
    public Survey survey{get;set;} 
    public List<CategoriesDTO> categories {get;set;} 
} 

두 번째 레벨 DTO는 다음과 같습니다.

public class CategoriesDTO 
{ 
    public Category category {get;set;} 
    public List<QuestionsDTO> questions {get;set;} 
} 

같은 방법으로 제 3 수준;

public class QuestionsDTO 
{ 
    public Question question {get;set;} 
    public List<Answer> answers{get;set;} 
} 

선택 후에 DTO 이름을 추가하는 것을 잊지 마십시오! contreller에서; 이렇게 쿼리가 변경됩니다.

var db = new DBContext() // => this is your database context 

var result = (from s in db.Surveys 
      select new SurveyDTO(){ 
       survey = s, 
       categories = (from c in db.Categories 
          where c.SurveyID = s.ID 
          select new CategoriesDTO(){ 
           category = c, 
           questions = (from q in db.Questions 
              where q.CategoryID = c.ID 
              select new QuestionsDTO(){ 
               question = q, 
               answers = (from a in db.Answers 
                 where a.QuestionID = q.ID 
                 select a).ToList() 
              }).ToList() // close the questions 
          }).ToList() // close the categories 
      }).ToList();// close the surveys 

return result; 

나는 설명이 명확하고 도움이되기를 바랍니다. 당신이 데이터를 얻을 하나의 쿼리를 사용하는 경우

IT는 데이터 액세스 문제보다는 MVC의 문제가있을 수 있습니다처럼이 보이는

관련 문제