2013-04-30 35 views
0

我無法理解爲什麼我的模型在發佈表單時未將其值傳遞給我的控制器。爲什麼我的模型沒有作爲參數傳遞到表單

我有一個強大的類型模型(UnitContract),從Web服務中獲取視圖,該模型包含一組值。在我的行動中,我試圖獲取我的模型中存在的int ID和bool Disabled字段。在調試時,我發現我的模型從窗體傳遞並不包含任何值。我錯過了什麼?

我的觀點(如UnitContract強類型的模型):

... 
<form class="pull-right" action="~/UnitDetails/EnableDisableUnit" method="POST"> 
     <input type="submit" class="k-button" value="Enable Unit"/> 
    </form> 

我的控制器動作:

[HttpPost] 
public ActionResult EnableDisableUnit(UnitContract model) 
{ 
    var client = new UnitServiceClient(); 
    if (model.Disabled) 
    { 
     client.EnableUnit(model.Id); 
    } 
    else 
    { 
     client.DisableUnit(model.Id); 
    } 

    return RedirectToAction("Index", model.Id); 
} 
+0

嗯,這是很難說沒有看到調用'EnableDisableUnit' – tnw 2013-04-30 12:51:00

+1

表單看起來很空的代碼...... – Jan 2013-04-30 12:51:01

+1

修改你的問題,列入了(應該)映射到'UnitContract'你的視場。 – 2013-04-30 12:51:30

回答

4

聽起來像您需要將模型中的字段添加到表單中。假設你的觀點接受UnitContract模式,那麼這樣的事情應該工作:

<form class="pull-right" action="~/UnitDetails/EnableDisableUnit" method="POST"> 
    @Html.HiddenFor(x => x.Id) 
    @Html.HiddenFor(x => x.Disabled) 
    <input type="submit" class="k-button" value="Enable Unit"/> 
</form> 

現在,當您提交表單,它應該提交的領域模型。

2

MVC框架將使用數據從表單創建模型。由於表單本質上是空的,因此沒有數據可以創建模型,所以您可以獲取沒有任何數據填充的對象。

發佈表單時,瀏覽器在請求中發送的唯一數據是表單內的數據。您必須將模型中屬性的數據作爲表單中的字段放入,以便可以使用該模型填充模型。

2

看看使用@Html.HiddenFor()。把它們放在你的表單中,你想看到的數據發回你的控制器應該在那裏。例如,你的形式看起來是這樣的......

<form class="pull-right" action="~/UnitDetails/EnableDisableUnit" method="POST"> 
    @Html.HiddenFor(x => x.Id) 
    @Html.HiddenFor(x => x.IsDisabled) 
    <input type="submit" class="k-button" value="Enable Unit"/> 
</form> 
0

比方說,你有這樣的模式:

public class UnitContract 
{ 
    public int Id { get; set; } 
    public DateTime SignedOn { get; set; } 
    public string UnitName { get; set; } 
} 

你的看法會是這個樣子:

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>UnitContract</legend> 

     @Html.HiddenFor(model => model.Id) 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.SignedOn) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.SignedOn) 
      @Html.ValidationMessageFor(model => model.SignedOn) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.UnitName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.UnitName) 
      @Html.ValidationMessageFor(model => model.UnitName) 
     </div> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 

在您的控制器中:

[ValidateAntiForgeryToken] 
    [HttpPost] 
    public ActionResult Edit(UnitContract unitContract) 
    { 
     // do your business here .... unitContract.Id has a value at this point 
     return View(); 
    } 

希望這是有幫助的。

相關問題