【问题标题】:Transitioning from classic asp to asp.net MVC从经典 asp 过渡到 asp.net MVC
【发布时间】:2014-03-05 21:51:14
【问题描述】:

我习惯于在经典中使用嵌套循环。来自第一个记录集的数据被传递到第二个记录集。我将如何在 MVC 中完成同样的事情?据我所知,我只能将一个模型传递给我的视图。

  <% 
  rs.open "{Call usp_SalesOrder}",oConn
  Do While (NOT rs.EOF)
  %>
    <div><% = rs("SalesOrderNumber")%></div>

    <% 
    rs2.open "{Call usp_SalesOrderLines(" & rs("SOKey") & ")}",oConn
    Do While (NOT rs.EOF)
    %>

      <div><% = rs2("SalesOrderLineNumber")%></div>

    <% 
    rs2.MoveNext
    Loop
    rs2.close
    %>        
  <% 
  rs.MoveNext
  Loop
  rs.close
  %>

【问题讨论】:

  • 这是您的新代码还是您在经典中所做的并想要转换的代码?
  • @RyanSchlueter 我希望这样嵌套的数据库调用效率非常低,尤其是在迭代 ADODB.Recordset 时。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp-classic


【解决方案1】:

我的建议是建立一个更强大的模型。的确,您只能将一个模型传递给您的视图,但您的模型可以包含多个数据集的结果,前提是您已在控制器中收集了这些数据集并将它们分配给模型。

我还建议远离 ViewBag。这是一个容易掉入的陷阱。当我说你以后会后悔的时候相信我。

对于您的示例,可能是这样定义的模型:

public class MyModel
{
    public List<SalesOrder> SalesOrders = new List<SalesOrder>();
}

public class SalesOrder
{
    public string SOKey = string.Empty;
    public List<SalesOrderLine> SalesOrderLines = new List<SalesOrderLine>();
}

以及在控制器中填充销售订单的代码:

public Action Index()
{
    MyModel model = new MyModel();
    model.SalesOrders.AddRange(CallUspSalesOrder());
    foreach (SalesOrder salesOrder in model.SalesOrders)
    {
        salesOrder.SalesOrderLines.AddRange(CallUspSalesOrderLines(salesOrder.SOKey));
    }

    return View(model);
}

这样,您就可以访问视图中的所有销售订单(及其销售订单行)。

【讨论】:

    【解决方案2】:

    我会说 Nathan 的帖子是一个好的开始。这是我从头到尾要做的事情。

    这就是我的模型:

    public class SalesOrderModel
    {
        public List<SalesOrderLines> SOLines = new List<SalesOrderLines>();
        public List<SalesOrder> SOHeader = new List<SalesOrder>();
    }
    

    然后我的控制器会这样做:

    public ActionResult Index()
    {
            List<SalesOrder> SalesOrder = callSalesOrderUSP.ToList();
            List<SalesOrderLines> SalesOrderLines = new List<SalesOrderLines>();
    
            foreach (var thing in SalesOrder)
            {
                SalesOrderLines.AddRange(callSalesOrderLinesUSP(thing.SOKey).ToList());
            }
    
            SalesOrderModel salesOrderModel = new SalesOrderModel
            {
                SOHeader = SalesOrder,
                SOLines = SalesOrderLines
            };
    
    
    
            return View(salesOrderModel);
    }
    

    那么在你看来你可以这样做:

    @foreach(var something in Model.SOHeader)
    {
        foreach (var thing in Model.SOLines.Where(i => i.SOKey == something.SOKey))
        {
            //display info here
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用 ViewBag 传递与您的模型无关的元素。也不要害怕创建自己的 ModelView 对象,这些对象可以在 View 和 Controller 之间工作。您的观点不应局限于您的模型必须提供的内容。

      查看this,了解如何在 MVC 中实现 ViewModel。

      也许看看this,看看你如何使用 ViewBag 将值传递给你的视图,与你的模型无关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 2011-05-05
        • 1970-01-01
        • 2010-11-03
        • 2011-03-23
        相关资源
        最近更新 更多