0

조사를 위해 VS2012, MVC 4, Entity Framework 4.0 프로젝트가 있습니다. 결과를 내 컨트롤러로 다시 가져 오는 방법을 찾는 데 어려움이 있습니다. 대부분의 답은 드롭 다운 목록에서 나옵니다. 각 질문마다 하나씩 있습니다. 내보기에 필요한 모든 정보가있는 간결한 개체의 테이블을 평평하게보기 위해 뷰를 사용하고 있습니다. SQL보기는 다음과 같습니다.ViewModel에없는 컨트롤러로 결과 반환

SELECT TOP (100) PERCENT 
    Questionaires.QuestionaireKey, 
    Questionaires.QuestionaireName, 
    Sections.SectionKey, 
    Sections.SectionName, 
    QuestionaireSections.DefaultSequence AS QAS_Sequence, 
    Questions.QuestionKey, 
    Questions.Question, 
    SectionQuestions.DefaultSequence AS SQ_Sequence, 
    QuestionTypes.QuestionTypeKey, 
    QuestionTypes.QuestionTypeName, 
    AnswerListCodes.AnswerListCodeKey, 
    AnswerListCodes.AnswerListCodeName, 
    QuestionAnswerListCodes.DefaultSequence AS QALC_Sequence 
FROM dbo.Questionaires AS Questionaires 
INNER JOIN dbo.QuestionaireSections AS QuestionaireSections 
    ON Questionaires.QuestionaireKey = QuestionaireSections.QuestionaireKey 
INNER JOIN dbo.Sections AS Sections 
    ON QuestionaireSections.SectionKey = Sections.SectionKey 
INNER JOIN dbo.SectionQuestions AS SectionQuestions 
    ON Sections.SectionKey = SectionQuestions.SectionKey 
INNER JOIN dbo.Questions AS Questions 
    ON SectionQuestions.QuestionKey = Questions.QuestionKey 
INNER JOIN dbo.QuestionTypes AS QuestionTypes 
    ON Questions.QuestionTypeKey = QuestionTypes.QuestionTypeKey 
INNER JOIN dbo.QuestionAnswerListCodes AS QuestionAnswerListCodes 
    ON Questions.QuestionKey = QuestionAnswerListCodes.QuestionKey 
INNER JOIN dbo.AnswerListCodes AS AnswerListCodes 
    ON QuestionAnswerListCodes.AnswerListCodeKey = AnswerListCodes.AnswerListCodeKey 

각 질문에는 AnswerListCodes에서 가능한 답이 있습니다. vw_Questions 엔티티는 읽기 전용입니다. 저장해야하는 데이터는 Answers & EvaluationAnswers Answers 테이블에 있습니다. 내 컨트롤러 코드는 지금까지 있습니다 :

이에 대한 display that I'm looking 결과
public ActionResult Index() 
{ 
    ViewBag.Answers = db.Answers.ToList(); 
    ViewBag.EvaluationAnswers = db.EvaluationAnswers.ToList(); 
    return View(db.vw_Questions.ToList()); 
} 

가 여기에 있습니다.

각 드롭 다운 목록에서 선택한 답변을 내 컨트롤러로 다시 가져 오는 방법이 표시되지 않습니다. 일부 답변도 텍스트가됩니다.

보기 코드 :

@model IEnumerable<Prototype_06.Models.vw_Questions> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 


<style> 
    table { border-collapse:collapse; } 
    table,th, td {border: 1px solid gray; } 
</style> 

@using (Html.BeginForm()) { 
@Html.AntiForgeryToken() 

<table> 
    @foreach (var group in (Model.OrderBy(x => x.QAS_Sequence).GroupBy(item => item.SectionName))) 
    { 
     <tr> 
      <th colspan="3">@group.Key</th> 
     </tr> 
     foreach (var item in group.OrderBy(x => x.SQ_Sequence).GroupBy(subItem => subItem.Question).Distinct()) { 
      <tr> 
       <td>&nbsp;</td> 
       <td>@item.Key</td> 
       <td> 
        <select> 
         <option value="@Guid.Empty"></option> 
        @foreach (var ans in item.OrderBy(x => x.QALC_Sequence)) 
        { 
         <option value="@ans.AnswerListCodeKey">@ans.AnswerListCodeName</option> 

        } 
        </select> 
       </td> 
      </tr> 
     } 
    } 
</table> 
<p> 
    <input type="submit" value="Save" /> 
</p> 
} 


@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

그래서 당신이 원하는 MVC 기본 사항에 대한 자세한 내용을 추천, 컨트롤러는 그것을 알고 새로운 뷰 모델을 반환합니다. 나는? – Blaise

+0

여전히 혼란 스럽습니다. 양식이 제출되면 양식의'action' 속성에 지정된 작업을 컨트롤러에 게시합니다. 그럼,보기에 코드를 보여 주시겠습니까? – Blaise

+0

핵심 부분은 MVC 방식으로 드롭 다운 목록을 렌더링하는 방법을 찾는 것이라고 생각합니다. 내가 선택한 데이터를 게시 된 데이터에 표시 할 수 있다고 생각하고 있습니다. –

답변

0

내 문제는 여러 테이블에서 데이터를 표시하고 표시보기에 필요하지 않은 테이블에 저장된다.

다음은 두 가지입니다. 페이지에 표시하는 데이터와 가져 오는 방법은 데이터를 수신하거나 데이터베이스에 저장하는 것과 아무런 관련이 없습니다.

보기를 사용하는 것은 완전히 나쁜 생각은 아니지만 그 유용성은 제한적입니다. 주로 조회수에는 색인이 없기 때문에 SELECT * 이외의 것을 발행하려는 경우 검색어가 다소 느립니다. 개인적으로 MVC 응용 프로그램에서 데이터베이스 뷰를 사용한 적이 없습니다. Entity Framework 자체가 충분히 좋지 않거나 효율적이지 않은 경우 저장 프로 시저를 사용합니다.

저장 프로 시저에서 필요한 데이터를 반환 한 다음이를 사용하여 표시 할보기 모델을 작성하십시오. 사후 작업의 경우 모델 바 인더로 필드를 매핑 할 수있는 경우 다른 뷰 모델, 필요한 경우 또는 저장할 실제 엔티티를 사용할 수 있습니다 (즉, 양식의 필드 이름이 엔티티의 필드 이름과 동일 할 경우)). 게시물에 뷰 모델을 사용해야하는 경우 대신 뷰 모델의 게시 된 데이터를 수동 또는 AutoMapper와 같은 도구를 사용하여 저장중인 엔터티에 매핑 할 수 있습니다.

0

양식의 조치 매개 변수를 데이터를 처리하려는 조치 (컨트롤러에서)로 설정해야합니다. 양식을 제출하면 지정된 조치로 전달됩니다. 그것은 여러 가지 방법으로 수행 할 수 있습니다처럼 아주 처음부터 BeginForm 문에 선언 :

Html.BeginForm("ProcessAnswers","Questionary",FormMethod.Post,new{id="frmQuestionary"}) 

경우 형태는 항상 같은 행동. 어떤 이유로 특정 조건에 따라 다른 작업에 게시해야하는 경우 (일반적이지 않음) 자바 스크립트에서 작업을 동적으로 변경할 수 있습니다 (예 : 실수를 방지하기 위해 게시하기 직전에) 작업을 원하는 값으로 설정할 수 있습니다. :

$('#frmQuestionary').attr('action', vURLOfDesiredAction); //vURLOfDesiredAction must have the proper url value, previously set from server side 

지금, 당신이 게시 할 예정입니다 작업에 대한, 당신이 보내는 데이터를 얻을 수 있어야합니다. 또한 여러 가지 방법으로 수행 할 수 있습니다 (MVC 데이터 바인딩의 작동 방식에 대해 잘 모르는 경우).모두의 전나무 당신은 당신이 게시 할 컨트롤의 이름을 설정해야합니다, 선택 제어가 더 이름이 없습니다, 그래서 그 액션에 해당 데이터를 저장할 것을 고려할 것 (

<select name="AnswerId"> 

그런 짓을 AnswerId라는 모델의 필드에서 적어도 AnswerId라는 변수가 분리 된 매개 변수로 동작을 선언 할 경우 해당 값을받는 변수가됩니다. 이 작업이 처리 할 모델이 반드시이 모델과 일치해야하는 것은 아닙니다. 이전보기에서 정의한 데이터를 표시하려면 데이터를 전송하는 데 적합한 데이터 여야하며 데이터를 가져온 경우 저장해야하는 테이블에 데이터를 저장해야합니다. @Blaise 이미 주석 것처럼

, 나는 사용자가 선택을하면 당신이