2012-04-20 74 views
2

我無法將視圖中的字段(文本框和複選框)提交給我的模型,但我不確定如何繼續。每次我點擊應該提交給模型的按鈕時,控制器都會檢查應該由視圖設置的字段,但會一直返回false。所以要麼他們沒有被置於首位,要麼控制器讀錯了。無論哪種方式,我都處於虧損狀態。請幫助:X將剃刀視圖字段綁定到MVC模型中3

視圖(有些簡化):

@model Model 

@Html.ValidationSummary() 

@{ Html.BeginForm("PrintReport", "Controller", FormMethod.Get, new {  @class = "form_ll" }); } 

<h1>@ViewBag.Title</h1> 

<div class="group"> 
    @Html.ValidTextBoxFor(Model => Model.ToDate) 
    @Html.ValidTextBoxFor(Model => Model.FromDate) 

    @Html.CheckBoxFor(Model => Model.Geplakt) 
    @Html.CheckBoxFor(Model => Model.Geparafeerd) 
    @Html.CheckBoxFor(Model => Model.Verschreven) 
    @Html.CheckBoxFor(Model => Model.Geannuleerd) 
    @Html.CheckBoxFor(Model => Model.Vermist) 
    @Html.CheckBoxFor(Model => Model.Vernietigd) 
    @Html.CheckBoxFor(Model => Model.Onbruikbaar) 
    @Html.CheckBoxFor(Model => Model.Misdruk) 
    @Html.CheckBoxFor(Model => Model.Teruggevonden) 
    @Html.CheckBoxFor(Model => Model.InOnderzoek) 
</div> 
<div class="button"> 
    @Html.Button("Print") 
</div> 
@{ Html.EndForm(); } 

型號:

[Serializable] 
public class Model : DomainObject 
{ 
    [DataType(DataType.Date)] 
    public DateTime? FromDate { get; set; } 
    [DataType(DataType.Date)] 
    public DateTime? ToDate { get; set; } 

    public bool Geplakt { get; set; } 
    public bool Geparafeerd { get; set; } 
    public bool Verschreven { get; set; } 
    public bool Geannuleerd { get; set; } 
    public bool Vermist { get; set; } 
    public bool Vernietigd { get; set; } 
    public bool Onbruikbaar { get; set; } 
    public bool Misdruk { get; set; } 
    public bool Teruggevonden { get; set; } 
    public bool InOnderzoek { get; set; } 

    public Model() 
    { 
     // Constructor 
    }    
} 

控制器:

public class Controller : ModelController<Model> 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     Model = new Model(); 
     return InternalIndex(); 
    } 

    [HttpGet] 
    public ActionResult InternalIndex() 
    { 
     return View("Index", Model); 
    } 

    [HttpGet] 
    public ActionResult PrintReport() 
    { 
     if (!Model.FromDate.HasValue || !Model.ToDate.HasValue) 
      ModelState.AddModelError("Date", "At leaste one date is null"); 
     else { 
      if (Model.FromDate.Value.CompareTo(Model.ToDate.Value) >= 0) 
       ModelState.AddModelError("Date", "First date is later then the second one"); 
     } 
     if(Model.IsAnythingChecked()) 
      ModelState.AddModelError("Checkboxes", "You haven't checked any checkboxes"); 

     if (ModelState.IsValid) 
     { 
      return View("PrintReport", Model); 
     } 
     else 
     { 
      return InternalIndex(); 
     } 
    }    

回答

4

您正在使用GET而不是POST。您正在將模型發送給控制器而沒有收到信息。一條線應該閱讀:

@{ Html.BeginForm("PrintReport", "Controller", FormMethod.Post, new {  @class = "form_ll" }); } 

您還需要你的模型發送到控制器,並設置在控制器的方法HttpPost:

[HttpPost] 
public ActionResult PrintReport(Model m) 
{ 
    if (!Model.FromDate.HasValue || !Model.ToDate.HasValue) 
     ModelState.AddModelError("Date", "At leaste one date is null"); 
    else { 
     if (Model.FromDate.Value.CompareTo(Model.ToDate.Value) >= 0) 
      ModelState.AddModelError("Date", "First date is later then the second one"); 
    } 
    if(Model.IsAnythingChecked()) 
     ModelState.AddModelError("Checkboxes", "You haven't checked any checkboxes"); 

    if (ModelState.IsValid) 
    { 
     return View("PrintReport", Model); 
    } 
    else 
    { 
     return InternalIndex(); 
    } 
} 

給一個嘗試。

+0

我在這裏得到了相同的答案5次,所以顯然這是問題所在。我認爲,因爲PrintReport方法只能通過Index方法訪問 - 而Index方法構造了Model,所以PrintReport使用的是相同的Model變量。我猜這不是,因爲在Action中傳遞一個模型的工作。雖然我覺得有點奇怪,但我不必使用傳遞的模型。 – shmow 2012-04-23 08:49:34

+0

我犯過同樣的錯誤。當PrintReport發佈給它時,它不會通過Index控制器方法,它將直接進入PrintReport方法。由於您使用表單發佈信息,因此必須將表單中的所有信息作爲PrintReport控制器中的參數綁定到您的模型,以便可以訪問所有屬性。 – tokyovariable 2012-04-23 15:27:53

3

它看起來像您發佈表單數據以只獲取控制器。此外,你還沒有告訴控制器期待一個模型。試試這個(注意去除[HTTPGET裝飾]的:

public ActionResult PrintReport(Model m) 
{ 
    if (!m.FromDate.HasValue || !m.ToDate.HasValue) 
     ModelState.AddModelError("Date", "At leaste one date is null"); 
    else { 
     if (m.FromDate.Value.CompareTo(m.ToDate.Value) >= 0) 
      ModelState.AddModelError("Date", "First date is later then the second one"); 
    } 
    if(m.IsAnythingChecked()) 
     ModelState.AddModelError("Checkboxes", "You haven't checked any checkboxes"); 

    if (ModelState.IsValid) 
    { 
     return View("PrintReport", Model); 
    } 
    else 
    { 
     return InternalIndex(); 
    } 
} 

我沒有現有的設置來進行測試,但應該工作

1

您將需要通過模型回爲一個你的控制器動作看到的變化的參數,反映在視圖,即

public ActionResult PrintReport(Model model) {

3

你需要讓你的PrintReport操作方法的兩個重載。

  • 其中一個具有[HttpGet]屬性。這是用來返回你的網頁
  • 一個與[HttpPost]屬性,需要Model類型的參數(模型類,其中真的應更新爲具有描述它是什麼的一個模型的名稱)。當您的表單將值提交回Web服務器時,會使用它。

您的表單應該更新做POST(更改FormMethod.GetFormMethod.Post)。

MVC模型綁定應該再休息了排序爲你,爲你的PrintReport操作方法的第二個重載創建模型類型的實例。

1

ModelController<Model>課程的內容是什麼?我懷疑是你在該課程中創建了一個新模型,當你編寫if (!Model.FromDate.HasValue和類似代碼時,這就是你的代碼所指的。

但是,您的控制器無法知道您的視圖回覆了哪個模型。爲了改變這一點,你需要做三件事情:

  1. 添加參數傳遞給PrintReport方法來表示你正在處理的模型,並用它來代替Model在你的代碼。
  2. [HttpPost]標記PrintReport方法,以便模型可以傳遞給方法。
  3. 更改您的表單以使用Post而不是Get。