2010-04-09 42 views
1

我有一個類包含另一個類作爲它的一個屬性。爲什麼默認模型聯編程序不會在回發中更新我的部分視圖模型?

public class SiteProperties 
{ 
    public SiteProperties() 
    { 
     DropFontFamily = "Arial, Helvetica, Sans-serif"; 
    } 
    public string DropFontFamily { get; set; } 

    private ResultPageProperties m_ResultPagePropertyList; 
    public ResultPageProperties ResultPagePropertyList 
    { 
     get 
     { 
      if (m_ResultPagePropertyList == null) 
       m_ResultPagePropertyList = new ResultPageProperties(); 
      return m_ResultPagePropertyList; 
     } 
     set { m_ResultPagePropertyList = value; } 
    } 
} 

第二類有一個屬性

public class ResultPageProperties 
{ 
    public ResultPageProperties() 
    { 
     ResultFontFamily = "Arial, Helvetica, Sans-serif"; 
    } 
    public string ResultFontFamily { get; set; } 
} 

我只是控制器抓住SiteProperties並返回視圖。提交時,它接受SiteProperties並返回相同的視圖。

public class CompanyController : Controller 
{ 
    public ActionResult SiteOptions(int id) 
    { 
     SiteProperties site = new SiteProperties(); 
     PopulateProperyDropDownLists(); 
     return View("SiteOptions", site); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult SiteOptions(SiteProperties properties) 
    { 
     PopulateProperyDropDownLists(); 
     return View("SiteOptions", properties); 
    } 

    private void PopulateProperyDropDownLists() 
    { 
     var fontFamilyList = new List<SelectListItem>(); 
     fontFamilyList.Add(new SelectListItem() { Text = "Arial, Helvetica, Sans-serif", Value = "Arial, Helvetica, Sans-serif" }); 
     fontFamilyList.Add(new SelectListItem() { Text = "Times New Roman, Times, serif", Value = "Times New Roman, Times, serif" }); 
     fontFamilyList.Add(new SelectListItem() { Text = "Courier New, Courier, Monospace", Value = "Courier New, Courier, Monospace" }); 
     ViewData["FontFamilyList"] = fontFamilyList; 
    } 
} 

該視圖包含呈現ResultPageProperties模型的局部視圖。

<% using (Html.BeginForm("SiteOptions", "Company", FormMethod.Post)) 
    {%> 

    <p><input type="submit" value="Submit" /></p> 
    <div>View level input</div> 
    <div> 
     <label>Font family</label><br /> 
     <%= Html.DropDownListFor(m => m.DropFontFamily, ViewData["FontFamilyList"] as List<SelectListItem>, new { Class = "UpdatesDropDownExample" })%> 
    </div> 

    <% Html.RenderPartial("ResultPagePropertyInput", Model.ResultPagePropertyList); %> 

<% } %> 

的部分只是

<div style='margin-top: 1em;'>View level input</div> 
<div> 
    <label>Font family</label><br /> 
    <%= Html.DropDownListFor(m => m.ResultFontFamily, ViewData["FontFamilyList"] as List<SelectListItem>, new { Class = "UpdatesResultPageExample" })%> 
</div> 

OK,所以當頁面呈現,您在這兩種選擇得到 「宋體,...」。如果您爲兩者選擇另一個選項並單擊提交,則該資源夾將填充SiteProperties對象並將其傳遞給控制器​​。但是,ResultFontFamily始終包含原始值。我期待它具有用戶選擇的價值。

我錯過了什麼?

回答

0

如果你看看調試器,並設置

public SiteProperties() 
{ 
***HERE***  DropFontFamily = "Arial, Helvetica, Sans-serif"; 
} 

斷點,那麼你可以看到,當你出於某種原因做回傳它試圖默認的構造函數它得到PopulateProperyDropDownLists前();

http://ubiquitous-tech.blogspot.com/2009/05/aspnet-mvc-post-to-controllers.html

對如何處理回發部分

public class ResultPageProperties 
{ 
    public ResultPageProperties() 
    { 
     ResultFontFamily = "Arial, Helvetica, Sans-serif"; 
    } 
    private string _resultFontFam; 
    public string ResultFontFamily { 
     get { return _resultFontFam; } 
     set { _resultFontFam = value; } 
    } 
} 

似乎工作的幾個選項......我不能開始告訴你爲什麼,雖然

+0

感謝您的幫助Hurricanepkt。我認爲聲明ResultFontFamily屬性的兩種方法是等價的。這讓我想起了我初始化類屬性的方式。由於我在我的getter中檢查null,我總是得到原始值。當我把它拿出來時,我在後控制器方法上留下了一個空值。 – user313118 2010-04-09 21:30:20

0

如果我改變了我聲明我的ResultPageProperties屬性的方式爲

public ResultPageProperties ResultPagePropertyList { get; set; } 

代替

private ResultPageProperties m_ResultPagePropertyList;  
public ResultPageProperties ResultPagePropertyList  
{  
    get  
    {  
     if (m_ResultPagePropertyList == null)  
      m_ResultPagePropertyList = new ResultPageProperties();  
     return m_ResultPagePropertyList;  
    }  
    set { m_ResultPagePropertyList = value; }  
} 

這是對POST方法無效。所以活頁夾似乎忽略它。

因此,我將控制器方法更改爲以下工作。

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult SiteOptions(SiteProperties properties, ResultPageProperties resultPageProp) 
    { 
     properties.ResultPagePropertyList = resultPageProp; 

     PopulateProperyDropDownLists(); 
     return View("SiteOptions", properties); 
    } 
1

這裏的問題是這樣的HTML輔助工作(的全部):試圖綁定,他們將首先在POST請求的值,之後的模型和可視數據拉值看時。這是設計。它基本上意味着,即使在你的post控制器動作中你嘗試修改這些值,html helper也不會使用它們並選擇那些最初由用戶發佈的。

<%= Html.DropDownListFor(m => m.DropFontFamily, 
    ViewData["FontFamilyList"] as List<SelectListItem>, 
    new { Class = "UpdatesDropDownExample" }) 
%> 

DropDownListFor助手檢測到存在是ResultFontFamily張貼的價值,並將用它代替你在你的控制器提供一個的。

可能的解決方法是編寫自己的幫手。

+0

我不能清楚地說明問題。 HTML助手正在做他們應該和預期的。它們顯示我在模型中傳遞給他們的內容。問題是關於粘合劑。當模型的屬性是傳遞給局部視圖的類時,它不會被活頁夾填充。我必須在後控制器操作中加入一個附加參數,以便讓活頁夾通過用戶輸入進行填充。 – user313118 2010-04-12 14:48:54