我在發佈mvc4 + EF6項目時遇到了問題。視圖中的模型將填充除Year和Period之外的所有字段(它們是下拉列表字段)。在附加到視圖的視圖模型中,字段「年份」和「期間」未設置爲DataAnnotations所需的值。但是,當我嘗試發佈時,ModelState是無效的。MVC4模型狀態無效
如何確定ModelState的失效原因?
見下面的代碼:
HTML:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Status)
<div class="form-horizontal">
<fieldset>
<legend>Edit Performance Cycle Details</legend>
<div class="form-group">
@Html.LabelFor(model => model.Year, new { @class = "col-lg-2 control-label" })
<div class="col-lg-10">
@Html.DropDownList("Year", new SelectList(ViewBag.Years), "--- Select Cycle Year ---", new { @class = "form-control", @id = "Year" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Period, new { @class = "col-lg-2 control-label" })
<div class="col-lg-10">
@Html.DropDownList("Period", new SelectList(ViewBag.Period, "Id", "Title"), "--- Select Period ---", new { @class = "form-control", @id = "Period" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.StartDate, new { @class = "col-lg-2 control-label" })
<div class="col-lg-10">
@Html.EditorFor(model => model.StartDate, "EditorForCycleSD")
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.CloseDate, new { @class = "col-lg-2 control-label" })
<div class="col-lg-10">
@Html.EditorFor(model => model.CloseDate, "EditorForCycleCD")
</div>
</div>
<div class="form-group">
<div class="col-lg-10 col-lg-offset-2">
@Html.ActionLink("Cancel", "Index", "Cycle", null, new { @class = "btn btn-default" })
<button class="btn btn-primary" type="submit">Submit</button>
</div>
</div>
</fieldset>
</div>
}
控制器代碼:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "StartDate, CloseDate, Id, Status")] EditCycle cycleUpdate, string Year, string Period)
{
try
{
if (ModelState.IsValid)
{
int yearPost = Int32.Parse(Year);
string periodPost = Period.Trim();
switch (periodPost)
{
case "1":
periodPost = yearPost.ToString() + " - H1";
break;
case "2":
periodPost = yearPost.ToString() + " - H2";
break;
default:
return View(cycleUpdate);
}
int pf = Int32.Parse(User.Identity.Name.Substring(8));
cycleUpdate.Year = yearPost;
cycleUpdate.Period = periodPost;
if (this.repo.EditCycle(cycleUpdate, pf))
{
return View("Index");
}
else
{
List<CyclePeriod> period = new List<CyclePeriod>{
new CyclePeriod {Id=1, Title="First Half : January 1 - June 30"},
new CyclePeriod {Id=2, Title="Second Half : July 1 - December 31"}
};
int[] years = new int[5];
for (int i = (DateTime.Now.Year - 2), j = 0; i <= (DateTime.Now.Year + 2); i++, j++)
{
years[j] = i;
}
ViewBag.Years = years;
ViewBag.Period = period;
return View(cycleUpdate);
}
}
else
{
List<CyclePeriod> period = new List<CyclePeriod>{
new CyclePeriod {Id=1, Title="First Half : January 1 - June 30"},
new CyclePeriod {Id=2, Title="Second Half : July 1 - December 31"}
};
int[] years = new int[5];
for (int i = (DateTime.Now.Year - 2), j = 0; i <= (DateTime.Now.Year + 2); i++, j++)
{
years[j] = i;
}
ViewBag.Years = years;
ViewBag.Period = period;
return View(cycleUpdate);
}
}
catch (Exception)
{
List<CyclePeriod> period = new List<CyclePeriod>{
new CyclePeriod {Id=1, Title="First Half : January 1 - June 30"},
new CyclePeriod {Id=2, Title="Second Half : July 1 - December 31"}
};
int[] years = new int[5];
for (int i = (DateTime.Now.Year - 2), j = 0; i <= (DateTime.Now.Year + 2); i++, j++)
{
years[j] = i;
}
ViewBag.Years = years;
ViewBag.Period = period;
return View(cycleUpdate);
}
}
可以在ModelState中檢查對象,它包含一個集合的屬性錯誤 – Jorge
或在視圖中添加ValidationSummary(),以便您可以看到錯誤消息。 – Dave