我必须在网页上实现多个单选按钮列表(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
是否有任何解决方案可以支持我的模型?我需要它来避免刷新我的页面并丢失所选的选项。
谢谢,
答案 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
实现自定义模型绑定器,并使用它来填充从您的服务获取的数据。