2012-03-19 21 views
10

我有一個新的相當基本的視圖/控制器的MVC 4應用程序。相關模型包含一對夫婦屬性,我已將其映射到隱藏表單字段。當頁面第一次渲染時(,例如通過HttpGet動作),它看起來都很好。但是,當通過選擇提交按鈕來完成表單時,呈現給操作的結果模型不再具有設置的隱藏字段值。這是一個詳細的演練。回覆後隱藏的表單字段不出現在MVC模型中

這裏是模型的樣品:

public class Application 
{ 
    public bool ShowSideBars { get; set; } 
} 

這裏是初始控制器 * 行動 *(這似乎很好地工作):

[HttpGet] 
public ActionResult Application() 
{ 
    var model = Request.ParseFromQueryString<Application>(); 
    model.ShowSideBars = true; 

    return View(model); 
} 

這映射到查看如下:

<fieldset> 
    @Html.HiddenFor(m => m.ShowSideBars) 
... 
</fieldset> 

這將導致以下加價到字段集裏面被渲染:

<input data-val="true" data-val-required="The ShowSideBars field is required." id="ShowSideBars" name="ShowSideBars" type="hidden" value="True" /> 

注意:我當然希望我知道爲什麼MVC已決定加入」。 ..字段是必需的'內容,當我沒有按要求標記,但這是另一個問題

這是活動在提交表單時調用的是。此時上述屬性將不再設置爲'true'。

[HttpPost] 
public ActionResult Application(Application application) 
{ 
    // Other work done here 

    return View(application); 
} 

目前還沒有定製型號粘結劑。另外,我測試了一些其他的數據類型,我看到了同樣的事情。

有人可以解釋爲什麼隱藏的表單值沒有被返回?我只是做這一切都錯了嗎?

+2

的'數據-VAL-required'被渲染,因爲模型類型是'bool'。 Bools默認是必需的,它們必須是真或假。如果你不想看到data-val所需的數據,那麼使這個屬性成爲'bool?'。 – danludwig 2012-03-19 19:15:32

+1

另外,Data Annotations會將「必需」添加到任何不可爲空的類型。 Ints和Bools將根據需要自動標記。 – 2012-03-19 19:17:07

+0

@ danludwig好主意!謝謝。這將防止整個頁面大小有點膨脹。 – JoeGeeky 2012-03-19 19:20:59

回答

6

我無法重現該問題(在VS 2010 .NET 4.0上運行的ASP.NET MVC 4 Beta)。

型號:

public class Application 
{ 
    public bool ShowSideBars { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Application() 
    { 
     var model = new Application(); 
     model.ShowSideBars = true; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Application(Application application) 
    { 
     return Content(application.ShowSideBars.ToString()); 
    } 
} 

查看:

@model Application 

@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(m => m.ShowSideBars) 
    <button type="submit">OK</button> 
} 

當我提交表單,模型綁定正確的POST動作ShowSideBars財產分配真正。

注:我當然希望我知道爲什麼MVC決定添加'...場時,我並沒有將其標記爲需要 要求」的內容,但這是 另一個問題

這是因爲非可空類型,如布爾總是需要。

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
+0

無法解釋它,但是當我將更改應用於模型和視圖以支持隱藏字段的可空類型時,它們全部開始工作。謝謝。 – JoeGeeky 2012-03-19 23:19:33

+0

我相信MVC會根據需要標記該字段,因爲bool不是可以爲空的類型。如果你想刪除這個需求,你需要使用bool?作爲類型。 – Kevin 2017-10-25 22:31:54

8

如果你有一個ReadOnlyAttribute裝飾價值將在模型中的特性:你可以從發射HTML5數據 - 停止ASP.NET MVC傭工*客戶端驗證他們的投入Application_Start以下行屬性不會被填充回你的模型中。畢竟,它是隻讀的。

+5

我創造了同樣的錯誤,有一個私人二傳手 – Kieran 2014-02-26 09:53:44

+1

我有一個屬性是'內部'設置。是的,這是做的(vs助手添加屬性從書面代碼添加屬性作爲內部集 – 2017-08-02 03:11:08

2

我有同樣的問題。表單沒有提交隱藏的屬性,因爲該模型類沒有適當的getter和setter該屬性。 我知道這不是你的問題,只是認爲它可能會幫助其他人在這個頁面上放貸。

4

我覺得領域的形式必須是html標籤內是張貼在隱藏的人回來,而不是忽視

+0

這是真的。把所有隱藏的領域內的形式標籤解決我的問題。 – Ariwibawa 2017-03-03 07:18:26

0

對我來說,那是因爲我已經聲明的字段,而不是一個屬性:

public BaseController.Modes Mode; 

不起作用。但是:

public BaseController.Modes Mode { get; set; } 

的作品。默認模型聯編程序僅適用於屬性。

0

我哄你不是,這是它可能發生的另一個原因。

我的表單中有兩個相同的字段。其他領域實際上並不在形式中,但那並不重要。

運行這個jQuery的開發者控制檯來查看有多少元素回來:

$("[id$=PropertyName]"); // Search for ids ending with property name. 

例子:

enter image description here