我希望在視圖中顯示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