2

調査申請をしています。調査には質問があり、質問にはQuestionOptionがあります。haveここに例があります。 この手法をlist(List)を使用して大きな形式で使用しようとしていますが、投稿すると、アイテムとアクティビティのリストが含まれているはずのViewmodel.Orderが、リストが空の状態で返されます。

私のQuestionModel.csはこのようです。

 public int Id { get; set; }       
 public string QuestionText { get; set; }     
 public System.Nullable<bool> OptionType1 { get; set; }
 public System.Nullable<bool> OptionType2 { get; set; }
 public List<QuestionOptionModel> OptionList = new List<QuestionOptionModel>();

「IEnumerablequestions」を投稿すると、ListOptionListがnullになります。これどうやってするの?

 public ActionResult CallSurvey()
    {
        IEnumerable<QuestionModel> questionModelList = (IEnumerable<QuestionModel>)SessionHelper.GetSessionObject(SessionKeys.SurveyKey);
       questionModelList = questionSrv.GetQuestionModel();
        return View(questionModelList);

    }

questionModelListには、すべての調査質問と質問オプションが含まれています。私がそれを投稿するとき、ポストバックはnulloptionListだけで来ています。

 [HttpPost]
    public ActionResult CallSurvey(IEnumerable<QuestionModel> questions)
    { ..... }

CallSurvey.cshtml

   <body>
    @using ((Html.BeginForm()))
    {
        @ViewBag.Test
        <section class="slides layout-regular template-kendo">
        @foreach (var item in Model)
        {<article>

                @Html.Partial("QuestionEditor", item)
               </article>
        }
   <div class="slide-area" id="prev-slide-area"></div>
        <div class="slide-area" id="next-slide-area"></div>
      </section> 
    }
</body>

QuestionEditor.cshtml

    @model LSMM.Business.Model.Survey.QuestionModel
@using LSMM.Web.Helpers
<div>
    @using (Html.BeginCollectionItem("Questions"))
    {

        <table id="table1">
            <tr>
                <td>
                    <div id="@Model.Id" class="hint">
                        @Html.HiddenFor(m => m.Id)
                        @Html.HiddenFor(m => m.QuestionText)
                        @Html.HiddenFor(m => m.OptionType1)
                        @Html.HiddenFor(m => m.OptionType2)



                        @for (int i = 0; i < Model.OptionList.Count; ++i)
                        {
                        @Html.LabelFor(m => m.OptionList[i].Id)
                        @Html.LabelFor(m => m.OptionList[i].QuestionId)
                        @Html.LabelFor(m => m.OptionList[i].Checked)
                        @Html.LabelFor(m => m.OptionList[i].Description)
                        @Html.LabelFor(m => m.OptionList[i])
                   }
                        <span id="sorular">@Model.Id. @Model.QuestionText</span>
                        <br />
                        <br />
                    </div>
                </td>
            </tr>
            <tr>
                <td>
                    <div class="hint2">
                        @Html.Partial("QuestionOptionEditor", Model)
                    </div>
                </td>
                <td>
                    <div id="@Model.Id-Img">
                        <h2 style="top: 200px; right: 0;">
                            <img src="../../Content/css/img/@Model.Id-Img.png"></h2>
                    </div>
                </td>
            </tr>
        </table>  

およびQuestionOptionEditor.cshtml

   @model LSMM.Business.Model.Survey.QuestionModel

 @using LSMM.Web.Helpers               



@foreach (var option in @Model.OptionList)
{


    <p>
        @if (@Model.OptionType1 == false)
        { 
            @Html.Partial("QuestionOptionModel", option)

        }
        else
        { 
            @Html.Partial("../Shared/DisplayTemplates/QuestionOptionModel", option)

        }
    </p>

}

ここでQuestionOptionModelはこのように表示されます。

@model LSMM.Business.Model.Survey.QuestionOptionModel

      @(Html.RadioButtonFor(m => m.Id, true, new { Id = @Model.Id, Name = @Model.QuestionId })) @Html.Label("Evet")  
      <br /> 
      <br />
      @(Html.RadioButtonFor(m => m.Id, false ,new { Id=@Model.Id, Name = @Model.QuestionId})) @Html.Label("Hayır")
4

2 に答える 2

2

デフォルトの ModelBinder で使用される命名規則によると、ラジオ ボタンの name 属性が「正しく」ありません。期待する値が表示されないのはそのためです。ModelBinder は探していたものを見つけることができませんでした。

これは簡単に修正でき、最終的にコードが少なくなるはずです。フレームワークを活用して、あなたのために働かせてください:

  1. MVC は IEnumerables をループできます。させてください。最近では、ビューに foreach ループを記述する理由はほとんどありません。
  2. それらのパーシャルを取り除きます。代わりにMVC のテンプレート機能を使用してください。

次に、ビューは次のように単純になります。

 <body>
        @using ((Html.BeginForm()))
        {
            @ViewBag.Test
            <section class="slides layout-regular template-kendo">
        <table id="table1">
            @* Table header goes here *@
            @Html.EditorFor(model => model.OptionList)
        </table>
       <div class="slide-area" id="prev-slide-area"></div>
            <div class="slide-area" id="next-slide-area"></div>
          </section> 
        }
</body>

EditorTemplate または DisplayTemplate を使用すると、MVC はフォーム フィールドの name 属性を自動的に修正します。パーシャルではそうはいきません。

よろしければ、もう 1 つの提案も。モデルでこれらの nulla-bool を取り除き、別の QuestionOptionModel タイプを記述します。DisplayTemplate/EditorTemplates は型システムにとって賢明であり、MVC は提示された型に一致するテンプレートを選択します。

したがって、QuestionOptionModel から派生する別のクラスを作成できます。

public class ExtendedQuestionOptionModel : QuestionOptionModel
{
    //Stuff goes here.
}

List<QuestionOptionModel>そして、以下を含むモデルにぶら下がっている可能性があります。

  • 質問オプションモデル
  • ExtendedQuestionOptionModel
  • 質問オプションモデル

これを行うと:

@Html.EditorFor(model => model.QuestionOptions)

MVC はオプション リストを調べて、QuestionOptionModel のエディター テンプレート、ExtendedQuestionOptionModel のエディター テンプレート、QuestionOptionModel のエディター テンプレートを再度レンダリングします。

ビューは単体テストできないため、プレイしたいゲームは、ビュー内の C# コードを最小限に抑えることです。単体テストされていないコードは、最終的に戻ってきてあなたを手に入れます。

于 2012-10-16T14:33:08.550 に答える
0

あなたの質問は少しあいまいです。率直に言って、これがあなたが探しているものであることを願っています:
IEnumerable は、次を使用してリストに変換できます

 List<foo>listFoo =iEnumerableEntityFoo.toList() 
于 2012-09-05T15:36:03.483 に答える