请帮助我不能在一个视图中了解多个模型

时间:2009-09-03 19:20:41

标签: c# asp.net-mvc model-view-controller subsonic

我一直试着直到我的头疼,并且已经读了很多,我的眼睛现在流血了。

我有一个控制器,我想获得订单的一组数据和订单项的一个列表。

我已经创建了一个订单类和一个订单商品类,并尝试这样做 订单将有一个订单项目列表,但它正在崩溃我的大脑我不知道我是否在正确的道路上或如果我错过了一些我只是没有得到它。

这是我的代码

public ActionResult finaliseQuote(string quoteid)
    {
        ViewData["quoteid"] = quoteid;

        // populate our class with data about our quote so far
        var orders = (from q in quote.All()
                      where q.quoteid == quoteid
                      select q).SingleOrDefault();



        //IList<quoteParts> orderItemsList = new quoteParts(orderitems); (this not work)

        quoteParts myparts = new quoteParts((from qi in quoteItem.All()
                          where qi.quote_id == quoteid
                          select qi).SingleOrDefault()); // compiles but this is not a list ?????

        return View();
    }

然后是我的两个班级:

    public class quoteInfo
{
    public IList<quoteParts> items { get; set; }
    public DateTime datecreated { get; set; }
    public double totalcost { get; set; }
    public string quotesid { get; set; }

    public quoteInfo(quote myquote)
    {
        items = new List<quoteParts>();
    }
}

public class quoteParts
{
    public string itemsid { get; set; }
    public bool isextra { get; set; }
    public string qty { get; set; }
    public string mx { get; set; }
    public string my { get; set; }
    public string prodid { get; set; }

    public quoteParts(quoteItem item)
    {
        itemsid = item.itemid;
        isextra = item.isextra;
        qty = item.qty;
        mx = item.measureX.ToString();
        my = item.measureY.ToString();
        prodid = item.prodid;
    }
}

我希望我可以创建一个视图,然后引用quoteInfo,并在页面的另一部分循环使用quoteParts。

我知道有些人可能看起来像是在偷懒,但是当我说得对,我就不会学习 一旦它工作,那么我理解,现在我想做OOP等,但似乎是在墙后撞墙。

非常感谢

2 个答案:

答案 0 :(得分:5)

您需要为视图创建一个ViewModel类,它可以保存数据:

public class QuoteViewModel
{
     public QuoteInfo Info { get; set; }
     public QuoteParts Parts { get; set; }
     public int QuoteId { get; set; }
}

将您的View强烈输入此类,并在您使用View返回的操作方法中创建一个实例:

public ActionResult finaliseQuote(string quoteid)
{
    var info = new QuoteInfo(
                  (from q in quote.All()
                   where q.quoteid == quoteid
                   select q).SingleOrDefault()
               );
    var parts = new QuoteParts(
                  (from qi in quoteItem.All()
                   where qi.quote_id == quoteid
                   select qi).SingleOrDefault()
               );

    var model = new QuoteViewModel { 
                        QuoteId = quoteid,
                        Info = info,
                        Parts = parts 
                    };

    return View(model);
}

请注意,我更改了类名称的大小以反映C#常用做法。 “

View,您可以通过访问ViewData.Model.InfoViewData.Model.PartsViewData.Model.QuoteId来呈现不同的项目。 (是的,M中的大写Model是有意的......)

此外,我不能保证这个代码可以在现成的工作 - 我不知道你的代码的哪些部分之前工作...

答案 1 :(得分:1)

QuoteParts构造函数接受一个quoteItem类型的对象。但是在finaliseQuote方法中,您将IQueryable传递给构造函数。它们是不兼容的类型,因此你看到的错误。您将需要在LINQ查询中选择单个项目或更改QueryPart以处理quoteItems的集合。

此外,您的视图模型不能代表您想要做的事情。您需要订单和属于该订单的商品列表。您在以后的帖子中添加了原始代码和QuoteViewModel处理单个订单和单个订单商品。您想要进行更改,以便您的视图模型具有订单商品列表。请查看下面的代码段。

public class QuotePart
{
  public int ProdId{get;set;}
  public string ItemId{get;set;}
  public string Quantity{get;set;}
}


model.Parts = from qi in quoteItem.All()
              where qi.quote_id == quoteid
              select new QuotePart{ ProdId = qi.prodid, ItemId = qi.itemid,Quantity=qi.qty};

请注意,零件现在是一个集合。您需要将QuoteViewModel上的Parts属性类型从QuoteParts更改为IEnumerable<IQuotePart>.