从视图到控制器的模型中保持列表

时间:2011-05-08 04:25:01

标签: asp.net-mvc-3 listbox models

我是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>();
    }
}

这基本上是由Entity Framework创建的对象的包装器。在我的控制器中,我将估计对象和两个语言对列表水合并将其传递给视图,如下所示:

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);
}

在我的部分&#39; view我有估计对象和语言对列表的控件:

<%: 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 :(得分:2)

首先加载提琴手并观察您的请求被发送过来。我猜你的列表框中的所有项目都没有发布 - 在这种情况下,没有模型绑定它。