我希望在视图中显示DropDownList,并在我的模型(ExampleAddSetupDto)中包含发送到视图的列表以填充下拉列表。这工作正常,但如果我有验证错误,并重新显示在传入模型中的视图,我的列表现在为空。MVC3 - 用于dropdownlist的列表信息在发布后为空
我的动作如下(注意:如果ModelState.IsValid失败,就会出现问题)。此外,Action方法的第二个参数可能看起来很奇怪,因为我使用Autofac将正确的服务注入方法中)。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Add(ExampleAddSetupDto add, IServiceAddCommit<IExampleAddSetupDto, IExampleAddCommitDto> service)
{
if (ModelState.IsValid)
{
var response = service.Create(add);
if (response.IsValid)
{
TempData["message"] = "You successfully added a new Example Entry";
return View("AddSuccess", response);
}
//else errors, so copy the errors over to the ModelState
response.CopyErrorsToModelState(ModelState, add);
}
// Some validation error, so redisplay same view
return View(add);
}
我的模型看起来是这样的:
public class ExampleAddSetupDto : IExampleAddSetupDto
{
[StringLength(50, MinimumLength = 2)]
public string Name { get; set; }
public int Option1Id { get; set; }
public int Option2Id { get; set; }
//-----------------------------
//now the properties for the drop down lists
public IList<Option1> PosibleEntriesForOption1 { get; set; }
public IList<Option2> PosibleEntriesForOption2 { get; set; }
}
我的看法是:
@model ServiceLayer.Example.DTOs.ExampleAddSetupDto
@{
ViewBag.Title = "Add";
}
<h2>Add</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Add an Example item</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-field">
@Html.Label("Option1")
@Html.DropDownListFor(model => model.Option1Id, new SelectList(Model.PosibleEntriesForOption1, "Option1Id", "OptionText"))
@Html.ValidationMessageFor(model => model.Option1Id)
</div>
<div class="editor-field">
@Html.Label("Option2")
@Html.DropDownListFor(model => model.Option2Id, new SelectList(Model.PosibleEntriesForOption2, "Option2Id", "OptionText"))
@Html.ValidationMessageFor(model => model.Option2Id)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
我明白,我需要与返回Model.PosibleEntriesForOption形成。我尝试使用Html.HiddenFor助手视图返回列表,即
@Html.HiddenFor(model => model.PosibleEntriesForOption1)
但这引发错误 “值” System.Collections.Generic.List`1 [DataClasses.ExampleClasses.Option1] ' 是无效的。'。
显然我在这里失去了一些东西,我将不胜感激关于如何返回列表的建议,以便重新显示模型不会导致错误。
谢谢丹。所有的答案都证实我需要在返回页面之前重新加载列表。有点可惜,但这是它的方式。我非常喜欢你的答案丹,因为它使用TempData,但我可以很好地解决它在服务中,因为我正在使用模板化服务。 – 2012-07-05 19:01:00