1

Webページ(ASP.NET MVC 4)に複数のラジオボタンリストを実装する必要があります。そのために、私はエディターテンプレートを使用しました。

コードは次のとおりです。

public class Evaluation
{
    public List<Question> Questions { get; set; }

    public Evaluation()
    {
        Questions = new List<Question>();
    }
}

    public class Question
    {
     private string _name;
     private string _translationText;

     public int LocalizationID { get; set; }
     public string Name
     {
        get { return _name; }
        set { _name = value; }
     }
     public string TranslationText
     {
        get
        {
            if (String.IsNullOrEmpty(_translationText))
            {
                return _name;
            }
            else
                return _translationText;
        }
        set { _translationText = value; }
     }
     public List<Answer> Answers { get; set; }
     [Required]
     public int SelectedAnswer { get; set; }
     public int Order { get; set; }

     public Question()
     {
        Answers = new List<Answer>();
     }
 }

コントローラ

    [HttpGet]
    public ActionResult Index()
    {
        try
        {
            var evaluation = _service.GetEvaluation();

            return View(evaluation);
        }

    [HttpPost]
    public ActionResult Index(Evaluation model)
    {
        if (!ModelState.IsValid)
        {
          //Save Evaluation 
        }
       retrun View(model);
    }

モデルが有効でない場合は、モデルのメインビューに戻るはずです。ただし、モデルは完全ではなく、LocalizationIDとSelectedAnswerの情報のみが含まれています。

意見

Index.chtml

@model Evaluation

@using (Html.BeginForm())
{
    @Html.ValidationSummary()
    @Html.HiddenFor(x=>x.Questions)

    @Html.EditorFor(x=>x.Questions)

     <p>
        @Html.Raw(Html.GenerateCaptcha())
        @Html.ValidationMessage("recaptcha")
    </p>

    <input type="submit" value="@T("Save_Answer")"/>

    @Html.ValidationMessage("ERROR_SURVEY")
}

エディターテンプレートの場合:

  @model Question

<div id="@Model.LocalizationID">
    @Html.HiddenFor(x=>x.LocalizationID)
    <h3>@Model.Order. @Model.TranslationText</h3>



    @if (Model.Order == 1)
    {
        <p>
            @Html.DropDownListFor(b => b.SelectedAnswer,new SelectList(Model.Answers,"LocalizationID","TranslationText"))

        </p> 
    } 
    else
    {
        foreach (var a in Model.Answers)
        {
            <p>
                @Html.RadioButtonFor(b=>b.SelectedAnswer, a.LocalizationID ) @a.TranslationText
            </p>
        }
    }

    @Html.ValidationMessageFor(x=> x.SelectedAnswer)
</div>

私はASP.NETMVCを初めて使用するため、次のコードを使用しました:ASP.NETMVC3ラジオボタン強いタイプ

モデルを元に戻すための解決策はありますか?ページが更新されたり、選択したオプションが失われたりしないようにするために必要です。

ありがとうございました、

4

1 に答える 1

1

一方向のコントローラーからビューへのプロパティを入力するには、各Webリクエストでサービスからモデルを再生成する必要があります。モデルのすべてのラウンドトリッププロパティ(たとえばSelectedAnswer)について、生成されたビューモデルに投稿された新しい値をマップする必要があります。

[HttpPost]
public ActionResult Index(Evaluation inputModel)
{
   if (ModelState.IsValid)
   {
     //Save Evaluation 
   }

   var outputModel = _service.GetEvaluation();

   for(var i = 0; i < outputModel.Questions.Count; i++)
       outputModel.Questions[i].SelectedAnswer = inputModel.Questions[i].SelectedAnswer;

   return View(outputModel);
}

これを実現するもう1つの、より高度でクリーンな方法は、カスタムモデルバインダーを実装し、Evaluationそれを使用してサービスから取得したデータを入力することです。

于 2013-02-28T09:29:26.207 に答える