2014-04-30 66 views
0

我在發佈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); 
     } 
    } 
+2

可以在ModelState中檢查對象,它包含一個集合的屬性錯誤 – Jorge

+1

或在視圖中添加ValidationSummary(),以便您可以看到錯誤消息。 – Dave

回答

0

如果一年期都是int類型,這意味着他們不能爲空(因此需要)。爲了避免這種情況,你必須使用int? (可空)

+0

不可爲空的int不會導致所需的驗證程序將該字段標記爲無效。對於值類型,模型值已經是默認值(T)。 – rossisdead

9

我同意蒂比。您可能想要使用可空類型。

「如何確定ModelState的失效原因?」

這將讓你鑰匙給他們的錯誤從ModelState中的列表(從你的模型是屬性名):

var errors = ModelState.Where(x => x.Value.Errors.Any()) 
       .Select(x => new { x.Key, x.Value.Errors });