2010-10-26 75 views
1

我會先說我的術語可能關閉,這就是爲什麼我可能無法找到這個問題的答案,併爲文本牆道歉。ASP.NET MVC2強類型查看數據綁定問題

我有一個強類型的視圖,它繼承自名爲Record的自定義類型。 Record具有不同數據類型的命名字段的字典 - 一些字符串,一些整數,一些DateTime/TimeSpans。

通過窗體上的一個下拉列表onchange,我得到了一個HttpPost Action方法在我的控制器中 - 據我所知,當前視圖的模型應該是'傳遞'到控制器方法。它似乎是這樣做的,但只是部分:記錄的DateTime和TimeSpan字段作爲其默認值。所有的字符串,int等字段都很好。

我在後端發生的數據綁定期間通過Record代碼進行調試,因爲調用HttpPost控制器方法,並且似乎創建了一個新的空白記錄,然後設置了各種屬性 - 但是如果作爲構造的一部分一個「空白」記錄屬性被初始化爲某個有效的非空值,這些屬性的Set方法永遠不會被調用。

我的問題是 - 這個數據綁定階段究竟發生了什麼?這是我描述的嗎?我是否必須將我的Record初始化的所有屬性設置爲空值才能正確地將它們綁定到數據綁定?

編輯:記錄(簡化的)

public class Record 
{ 
    public Record() : base() 
    { 
     fields.Add("Id", new FieldValue { DataType = typeof(int) });  
     fields.Add("StartDateTime", new FieldValue { DataType = typeof(DateTime) });  
    } 

    private Dictionary<string, FieldValue> fields = new Dictionary<string, FieldValue>(); 

    public Dictionary<string, FieldValue> Fields 
    { 
     get 
     { 
      return fields; 
     } 
    } 

    public long? Id 
    { 
     get 
     { 
      FieldValue fieldValue = Fields["Id"]; 
      return fieldValue != null ? (long?)fieldValue.Value : null; 
     } 
     set 
     { 
      SetFieldValue("Id", value); 
     } 
    } 

    public DateTime StartDateTime 
    { 
     get 
     { 
      FieldValue fieldValue = Fields["StartDateTime"]; 
      if (fieldValue == null || fieldValue.Value == null) 
      { 
       return DateTime.MinValue; 
      } 
      else 
      { 
       return (DateTime)fieldValue.Value; 
      } 

     } 
     set 
     { 
      SetFieldValue("StartDateTime", value); 
     } 
    } 

    protected void SetFieldValue(string fieldName, object value) 
    { 
     Fields[fieldName] = new FieldValue(value); 
    } 
} 

值類FieldValues的詞典:

public class FieldValue 
{ 
    internal FieldValue(object value) 
    { 
     DataType = value.GetType(); 
     Value = value; 
    } 

    internal FieldValue() 
    { } 

    public Type DataType { get; set; } //The data type of the field 
    public object Value { get; set; } //The value of the field 
} 

我顯示強類型的記錄視圖,顯示開始時間的形式,但不是Id。當發生HttpPost時,處理該視圖的HttpPosts的控制器方法會收到與原始Record具有相同Id的記錄,但會收到DateTime.MinValue的StartDateTime。

Edit2:我在視圖中顯示任何模型字段的方式是否與控制器的HttpPost方法將「看到」模型有什麼關係?

+0

你能詳細說明一下你想要的/觀察到的行爲是什麼嗎? – 2010-10-26 04:16:59

+0

也許一些代碼會揭示一些事情正在發生。 – jordanbtucker 2010-10-26 04:18:06

+0

在原帖中添加的代碼。我正在理解MVC如何將視圖模型的副本「傳遞」給控制器方法 - 我可能在做一些愚蠢的事情,如果我知道模型究竟是如何回到控制器。對於我所知道的答案是'當然它不會覆蓋默認值,這不是它的工作原理' – LMF 2010-10-26 04:59:12

回答

1

原來這是一個幾件事情的組合:

我用,以顯示我的startDateTime場視圖代碼是沒有得到很好的結構不夠默認的DataBinder把它撿起來。

<input id="StartDateTime" type="text" value="<%= Model.StartDateTime.ToString("g") %>" /> 

這是行不通的。無論這是否

<input id="StartDateTime" type="text" value="<%= Model.StartDateTime %>" /> 

這工作:

<%= Html.TextBoxFor(model => Model.StartDateTime)%> 

的第二個問題是,我的startDateTime文本字段被禁用(有HTML屬性禁用=「禁用」) - 它的意思只是認爲,但禁用的字段不會返回任何帖子(如提到的here),所以即使我使用TextBoxFor HtmlHelper,它仍然無法正常工作。感謝大家的鏈接,現在我更瞭解了讓數據綁定工作的重要屬性。

0

您是否在尋找IModelBinder的執行? 有一個默認的IModelBinder

這是你在找什麼?

+0

排序?這些鏈接中的第一個描述了一個與我在做什麼類似的例子,除了我的情況(使用MDSN示例)Person對象以控制器方法結束public ActionResult Create(Person person)具有正確的ID,但是默認的Zipcode。如果第二個鏈接中的DefaultModelBinder實際上是第一個示例中的綁定,它就在幕後,我無法看到它的哪個方法被調用了什麼參數,所以不能從中收集很多東西。我會繼續閱讀。 – LMF 2010-10-26 05:21:34

0

你有一個名爲StartDateTime的表單域嗎?默認的模型綁定器將表單字段的id與視圖模型中的屬性名稱相匹配。如果您沒有名爲StartDateTime的表單字段,則模型聯編程序將不會填充該屬性。

如果您需要跟蹤值但不顯示它,您始終可以在頁面上使用隱藏框,以便可以返回該值。

此外,由於日期和時間組件以及網頁中使用的格式,可能會遇到麻煩。 Scott Hanselman has a blog post這可能有幫助。

+0

表單字段的名稱與模型中的屬性名稱相同。奇怪的是,其中一個正確設置的屬性是ID,儘管我在OP中原先所說的內容(現在已編輯),但它並不在頁面的表單域中。我將閱讀博客文章,看看它是否是格式問題,謝謝你的鏈接。 – LMF 2010-10-26 06:10:57

+0

由於路由綁定,ID屬性是否被填充?例如,如果您的回髮網址類似於/ controller/action/id,則會導致ID屬性填充到視圖模型對象中。 – 2010-10-26 15:01:31

+0

是的,Details頁面的路徑是controller/action/id。我不認爲這是一個日期格式化的東西,因爲用戶根本沒有輸入日期 - 它是從數據源獲取的DateTime對象,並在禁用的文本字段中顯示在屏幕上。 – LMF 2010-10-26 22:05:51