2016-11-02 1 views
-1

Ich habe den folgenden Code:Eindeutiger Name auf Name-Attribut asp.net Mvc in for-Schleife

foreach (var questionGroups in Model.ClientQuestionGroups) 
{ 
    for (var j = 0; j < questionGroups.Questions.Count; j++) 
    {  
     <div class="test"> 
      @Html.HiddenFor(m => m.QuestionAnswers[j].FormAnswerId) 
      @Html.HiddenFor(m => m.QuestionAnswers[j].QuestionId) 
      @foreach (var alternative in questionGroups.Questions[j].QuestionAlternatives) 
      { 
       if (alternative.NestedQuestion != null) 
       { 
        nestedQuestions.Add(alternative.NestedQuestion); 
       } 
      } 
     </div> 
    } 
    if (nestedQuestions.Count > 0) 
    { 
     for (var i = 0; i < nestedQuestions.Count; i++) 
     { 
      <div class="nestedQuestion"> 
       @Html.HiddenFor(m => m.QuestionAnswers[i].FormAnswerId) 
       @Html.HiddenFor(m => m.QuestionAnswers[i].QuestionId) 
       @foreach (var alt in nestedQuestions[i].QuestionAlternatives) 
       { 
        @Html.DisplayFor(m => alt.AlternativeText) 
        @Html.RadioButtonFor(m => m.QuestionAnswers[i].AlternativeId, alt.Id, new { @class = "questionAlternative" }); 
       } 
      </div> 
     } 
    } 
} 

Dies erzeugt die folgende html:

<div class="test"> 
<input id="QuestionAnswers_0__FormAnswerId" type="hidden" value="00000000-0000-0000-0000-000000000000" name="QuestionAnswers[0].FormAnswerId" data-val-required="Fältet FormAnswerId krävs." data-val="true"> 
<input id="QuestionAnswers_0__QuestionId" type="hidden" value="427d0a77-b7b7-48b0-956a-28794145e0da" name="QuestionAnswers[0].QuestionId" data-val-required="Fältet QuestionId krävs." data-val="true"> 
Yes 
<input id="QuestionAnswers_0__AlternativeId" class="questionAlternative" type="radio" value="aabf2548-abca-4cb5-89d8-759f2d71be01" nestedquestion="895015c0-2bf0-4c5a-95c9-8d4b29671bf7" name="QuestionAnswers[0].AlternativeId" data-val-required="Fältet AlternativeId krävs." data-val="true"> 
No 
<input id="QuestionAnswers_0__AlternativeId" class="questionAlternative" type="radio" value="91b220dc-3ef3-45a9-8369-dc1e4e2530a8" nestedquestion="" name="QuestionAnswers[0].AlternativeId"> 
</div> 

<div class="nestedQuestion questionDiv"> 
<p>Testar2</p> 
<p>Testar2</p> 
<input id="QuestionAnswers_0__FormAnswerId" type="hidden" value="00000000-0000-0000-0000-000000000000" name="QuestionAnswers[0].FormAnswerId"> 
<input id="QuestionAnswers_0__QuestionId" type="hidden" value="427d0a77-b7b7-48b0-956a-28794145e0da" name="QuestionAnswers[0].QuestionId"> 
Yes 
<input id="QuestionAnswers_0__AlternativeId" class="questionAlternative" type="radio" value="aabf2548-abca-4cb5-89d8-759f2d71be01" name="QuestionAnswers[0].AlternativeId"> 
No 
<input id="QuestionAnswers_0__AlternativeId" class="questionAlternative" type="radio" value="91b220dc-3ef3-45a9-8369-dc1e4e2530a8" name="QuestionAnswers[0].AlternativeId"> 
</div> 

Wie Sie sehen können, die ID- Attribut und Name-Attribut hat den gleichen Wert/Name. Ich will das nicht. Ich möchte, dass das erste div 0 ist, und das geschachtelte Frage div zu 1 und so weiter sein soll. Ich weiß, dass dies geschieht, weil es sich in der gleichen Schleife befindet.

Ich kann nicht ganz herausfinden, wie dieses Namensschema zu lösen ist. Wer kann mich in die richtige Richtung drängen?

+0

Sie Zählerwerte für Ihre Loops zu verwenden versuchen, und dann zählt als Suffix Name für div verwenden .. – NMathur

+0

@NMathur: Können Sie mir ein Beispiel geben? – Bryan

+0

Warum wird m.QuestionAnswers zweimal in zwei verschiedenen Abschnitten verwendet? Sind sie jeweils Teil einer anderen Form? –

Antwort

0

Wo bauen Sie das auf? Ich denke, das ist deine Sicht? Meiner Meinung nach ist dies keine Best Practice, weil du zu viel Logik drin hast. Ist es nicht möglich, dies innerhalb Ihrer Business-Schicht/mvc (Controller) zu berechnen? Alle if-Anweisungen sind zu viel. Innerhalb von MVC solltest du so viel Logik wie möglich in deiner Sicht vermeiden. Wenn ich diesen Teil repariere, kannst du eine Foreach in einer Foreach ohne die For-Schleifen machen. Macht es viel einfacher zu verwalten.

Sind die for-Schleifen überhaupt erst notwendig?

Grüße,

S ..

+0

Nein. Ich möchte dies jetzt in der Ansicht lösen. – Bryan

+0

Btw ... Wenn Sie wollen nur die zweite 0 zu 1. Lassen Sie die for-Schleife bei 1 und nicht 0 beginnen. –

0

Kein Beispiel im Auge war .. aber hopw dabei helfen können ..

@{ int testCounter = 0; int nestedQuestionsCounter = 0; } 

@foreach (var questionGroups in Model.ClientQuestionGroups) 
{ 

     for (var j = 0; j < questionGroups.Questions.Count; j++) 
     {  
     <div class="@(testCounter)test"> 
      @Html.HiddenFor(m => m.QuestionAnswers[j].FormAnswerId) 
      @Html.HiddenFor(m => m.QuestionAnswers[j].QuestionId) 
      @foreach (var alternative in questionGroups.Questions[j].QuestionAlternatives) 
      { 
       if (alternative.NestedQuestion != null) 
       { 
        nestedQuestions.Add(alternative.NestedQuestion); 
       } 
      } 
     </div> 

    } 

    if (nestedQuestions.Count > 0) 
    { 
     nestedQuestionsCounter = 1; 
     for (var i = 0; i < nestedQuestions.Count; i++) 
     { 
      <div class="@(nestedQuestionsCounter)nestedQuestion"> 
       @Html.HiddenFor(m => m.QuestionAnswers[i].FormAnswerId) 
       @Html.HiddenFor(m => m.QuestionAnswers[i].QuestionId) 
       @foreach (var alt in nestedQuestions[i].QuestionAlternatives) 
       { 
        @Html.DisplayFor(m => alt.AlternativeText) 
        @Html.RadioButtonFor(m => m.QuestionAnswers[i].AlternativeId, alt.Id, new { @class = "questionAlternative" }); 
       } 
      </div> 
      nestedQuestionsCounter++; 
     } 
    } 
    testCounter++; 
} 
+0

Vielen Dank für Ihre Antwort. Aber es funktioniert nicht ganz gut. – Bryan

+0

ohk .. so haben Sie es bereits versucht .. das ist in Ordnung .. – NMathur

1

for (var i = 0; i < nestedQuestions.Count ; i ++

) mit der folgenden für die Schleife

die zweite Änderung:

f oder (var i = 1; i < nestedQuestions.Count; Ich ++)

Aber das wird schlecht sein, denn wenn Sie mehrere Fragen und mehrere verschachtelte Fragen haben, werden sie durcheinander geraten.

Vielleicht ist so etwas wie dies besser:

if (nestedQuestions.Count > 0) 
{ 
    for (var i = 0; i < nestedQuestions.Count; i++) 
    { 
     <div class="nestedQuestion"> 
      @Html.Hidden("NestedQuestions", Model.QuestionAnswers[i].FormAnswerId) 
      @Html.Hidden("NestedQuestions", Model.QuestionAnswers[i].QuestionId) 
      @foreach (var alt in nestedQuestions[i].QuestionAlternatives) 
      { 
       @Html.Display("NestedQuestion", alt.AlternativeText) 
       @Html.RadioButton("NestedQuestion", m.QuestionAnswers[i].AlternativeId, alt.Id, new { @class = "questionAlternative" }); 
      } 
     </div> 
    } 
} 

Dies wird erzeugen, was u wollen, aber in Ihrem Beitrag Aktion sollte u eine Eigenschaft haben diese verschachtelte Objekte zu fangen. Der defaultModelBinder wird es binden, wenn Sie die Namen übereinstimmen.

Grüße,

Sven

+0

Nein, das funktioniert nicht. Ich kann die Schleife nicht so ändern, wie Sie möchten, weil i Bryan

+0

Hehe ... das ist nicht, was Sie gefragt haben. U könnte mit der Anweisung herumschwirren oder eine zusätzliche if-Anweisung am Ende der for-Schleife erstellen und sie auf eine Anweisung setzen, die Sie bevorzugen. Alles nicht vorzuziehen und wie ich bereits erwähnt habe, ist alles besser auf der Serverseite gelöst, aber da du nicht willst, dass mein zweiter Teil des letzten Posts deine beste Option ist. –