2011-05-08 49 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