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

dav*_*der 1 c# subsonic model-view-controller asp.net-mvc

我已经尝试过,直到我的头疼,并且已经读了很多,我的眼睛现在流血了.

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

我已经创建了一个订单类和一个订单商品类,并尝试获取它,以便订单将有一个订单商品列表但它崩溃了我的大脑我不知道我是否在正确的道路上或如果我错过了什么我只是不明白.

这是我的代码

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();
    }
Run Code Online (Sandbox Code Playgroud)

然后我的2个班:

    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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我知道有些人可能看起来我很懒,但我不知道当我说得对它一旦它起作用然后我理解,现在我想做OOP等但似乎是撞墙后墙.

非常感谢

Tom*_*han 5

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

public class QuoteViewModel
{
     public QuoteInfo Info { get; set; }
     public QuoteParts Parts { get; set; }
     public int QuoteId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

将你的View强类型命名为这个类,并在你返回的action方法中创建一个实例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);
}
Run Code Online (Sandbox Code Playgroud)

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

在您的View,您可以通过访问或者使不同的项目ViewData.Model.Info,ViewData.Model.PartsViewData.Model.QuoteId.(是的,资本MModel是故意的......)

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