2011-05-08 80 views
1

我對ASP.NET MVC很新,所以請耐心等待。當用戶提交表單時,我遇到了問題,即在我的模型中保留了一個列表返回給控制器。模型中的持久化列表從視圖到控制器

這是一個場景: 這是一個web應用程序,它允許用戶創建翻譯工作的估算。每個估計都有一個語言對列表。爲了讓用戶能夠添加語言對,他們需要列出所有可用的語言對。

我的模型看起來是這樣的:

public class EstimateModel 
{ 
    public tblEstimate Estimate { get; set; } 
    public IEnumerable<tblEstimateLangPair> EstimateLanguagePairs { get; set; } 
    public IEnumerable<tblLangPair> LanguagePairs { get; set; } 

    public EstimateModel() 
    { 
     Estimate = new tblEstimate(); 
     EstimateLanguagePairs = new List<tblEstimateLangPair>(); 
     LanguagePairs = new List<tblLangPair>(); 
    } 
} 

這基本上是由實體框架創建的對象的包裝。在我的控制器我水合估計對象和兩個語言對列表並將它傳遞到像這樣的觀點:

public ActionResult Edit(int estimateID) 
{ 
    EstimateModel model = new EstimateModel(); 

    model.Estimate = db.tblEstimates.Single(t => t.EstimateID == estimateID); 

    model.LanguagePairs = db.tblLangPairs.ToList(); 

    var query = from e in db.tblEstimateLangPairs 
       join lp in db.tblLangPairs on e.LangPairID equals lp.ProductID 
       where e.EstimateID == estimateID 
       select new { e.EstimateID, e.LangPairID, lp.Language_pairs}; 

    model.EstimateLanguagePairs = query.ToList().ConvertAll(p => new tblEstimateLangPair 
    { 
     EstimateID = p.EstimateID, 
     LangPairID = p.LangPairID, 
     Language_pairs = p.Language_pairs 
    }); 

    return PartialView(model); 
} 

在我的「部分」視圖我有控制用於估計對象和語言對列表:

<%: Html.TextBoxFor(model => model.Estimate.JobNumber)%> 
<%= Html.ListBoxFor(model => model.LanguagePairs, new SelectList(Model.LanguagePairs, "LangPairID", "Language_pairs"))%> 
<%= Html.ListBoxFor(model => model.EstimateLanguagePairs, new SelectList(Model.EstimateLanguagePairs, "LangPairID", "Language_pairs"))%> 

到目前爲止很好。我可以只填寫這些列表框。我可以遍歷控制器代碼,看到我的模型在那裏爲我的模型中的所有這些對象提供數據,並將其傳遞給視圖。

我的問題是,當我試圖提交回控制器保存任何更改。 Model.Estimate對象將其所有屬性保留回控制器沒有問題。當我查看控制器方法中保存更改的模型時,我看到列表對象,但它們的計數爲零。

保存方法控制器:

[HttpPost] 
public ActionResult EditEstimate(EstimateModel model) 
{ 
    db.tblEstimates.Attach(model.Estimate); 
    db.ObjectStateManager.ChangeObjectState(model.Estimate, EntityState.Modified); 

    foreach (tblEstimateLangPair langPair in model.EstimateLanguagePairs) 
    { 
     db.tblEstimateLangPairs.Attach(langPair); 
     db.ObjectStateManager.ChangeObjectState(langPair, EntityState.Modified); 
    } 

    db.SaveChanges(); 

    return Redirect("/Home/Index"); 
} 

你怎麼堅持列表,或集合在一個模型回控制器提交表單數據是什麼時候?我相信我的問題在於我如何使用這些ListBoxFor對象。

任何幫助將不勝感激!

回答

1

首先加載提琴手,並觀看您的請求被髮送。我猜你的列表框中的所有項目都沒有被髮布 - 在這種情況下,將沒有模型綁定它。

+0

我現在正在使用localhost,所以對我來說fiddler不是一種選擇。當Web服務器變得可用時,我會嘗試這個。謝謝! (抱歉,我對stackoverflow是新手,顯然還不能給你任何意見。) – SteveB 2011-05-09 18:55:11

+0

你當然可以在本地使用fiddler - 加載fiddler,你可以嘗試ipv4.fiddler作爲你的主機名 - 它將通過fiddler進行映射。如果使用IE只使用「localhost./whatever」注意點,或使用您的機器名稱。 – 2011-05-10 01:04:30