ASP.NET MVC 4 - 使用编辑器模板的单选按钮列表:模型不完整

时间:2013-02-28 09:14:02

标签: asp.net-mvc mvc-editor-templates

我必须在网页上实现多个单选按钮列表(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.NET MVC的新手,我从以下代码中获取了代码:ASP.NET MVC 3 Radio Button Strongly typed

是否有任何解决方案可以支持我的模型?我需要它来避免刷新我的页面并丢失所选的选项。

谢谢,

1 个答案:

答案 0 :(得分: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);
}

实现此目的的另一种更先进但更清晰的方法是为Evaluation实现自定义模型绑定器,并使用它来填充从您的服务获取的数据。