Asp.net mvc ASP.NET MVC:具有模型的连接控制器

Asp.net mvc ASP.NET MVC:具有模型的连接控制器,asp.net-mvc,stored-procedures,uiviewcontroller,Asp.net Mvc,Stored Procedures,Uiviewcontroller,我还在学习,但在stackoverflow commnuties的帮助下,我已经能够越来越近了 我现在看到的是一个视图“Index.aspx”: 以及控制器: public ActionResult Index() { LinqToDealsDataContext db = new LinqToDealsDataContext(); XElement xmlTree = XElement.Parse("<Request>

我还在学习,但在stackoverflow commnuties的帮助下,我已经能够越来越近了

我现在看到的是一个视图“Index.aspx”:

以及控制器:

public ActionResult Index()
        {
            LinqToDealsDataContext db = new LinqToDealsDataContext();
            XElement xmlTree = XElement.Parse("<Request><ZipCode>92612</ZipCode></Request>");

            var deals = db.spSearchDeals(xmlTree);

            return View(deals);
        }
public ActionResult Index()
        {
            return(DealService.GetByZipcode(92612));
        }
我猜我的控制器和我的模型之间存在连接问题。。。我不知道为什么。请帮我连接这个最后的电话


注意:我确实理解,最终我应该将控制器中的逻辑分离为存储库模式,但现在,这样就可以了。

您需要转换此调用返回的数据:

var deals = db.spSearchDeals(xmlTree);
进入
GetDealsModel
类型。比如:

GetDealsModel dealsModel = new GetDealsModel()
{
   DealId = deals.DealId,
   StreetAddress = deals.StreetAddress,
....
};

return View(dealsModel);
return new GetDealsModel { DealId = deals.Id, // other fields here }
原因是您的视图是强类型的,以获取
GetDealsModel
,但您的
deals
变量不是该类型,当您将其传递给视图时,它会给您该异常。

您需要转换此调用返回的数据:

var deals = db.spSearchDeals(xmlTree);
进入
GetDealsModel
类型。比如:

GetDealsModel dealsModel = new GetDealsModel()
{
   DealId = deals.DealId,
   StreetAddress = deals.StreetAddress,
....
};

return View(dealsModel);
return new GetDealsModel { DealId = deals.Id, // other fields here }
原因是您的视图是强类型的,以获取
GetDealsModel
,但您的
deals
变量不是该类型,当您将其传递给视图时,它会给您该异常。

您应该创建GetDealsModel类型的对象,但您的DB查询返回Data.Models.spSearchDealsResult类型的对象。尝试以下方法:

GetDealsModel dealsModel = new GetDealsModel()
{
   DealId = deals.DealId,
   StreetAddress = deals.StreetAddress,
....
};

return View(dealsModel);
return new GetDealsModel { DealId = deals.Id, // other fields here } 返回新的GetDealsModel { DealId=deals.Id, //这里还有其他领域 }
您应该创建GetDealsModel类型的对象,但DB查询返回Data.Models.spSearchDealsResult类型的对象。尝试以下方法:

GetDealsModel dealsModel = new GetDealsModel()
{
   DealId = deals.DealId,
   StreetAddress = deals.StreetAddress,
....
};

return View(dealsModel);
return new GetDealsModel { DealId = deals.Id, // other fields here } 返回新的GetDealsModel { DealId=deals.Id, //这里还有其他领域 }
将以下项目添加到您的学习曲线中:

  • 存储库模式

  • 问自己以下问题:为什么我需要一个服务层

  • 读史蒂文·桑德森的书。它教你用MVC思考

  • 上述内容适用于您的问题,因为您的问题显然与控制器中的代码相关,这些代码应该在您的模型中(即,数据访问代码应该在存储库类中)。也就是说,你不是在用MVC思考

    您的模型应该包括必要的存储库类,例如DealRepository。

    您需要一个服务类来将存储库从数据库中挖掘出来的对象映射到模型类:这样,转换问题就会被封装到服务层代码中。

    如果执行此操作,则可以在控制器中写入:

    public ActionResult Index()
            {
                LinqToDealsDataContext db = new LinqToDealsDataContext();
                XElement xmlTree = XElement.Parse("<Request><ZipCode>92612</ZipCode></Request>");
    
                var deals = db.spSearchDeals(xmlTree);
    
                return View(deals);
            }
    
    public ActionResult Index()
            {
                return(DealService.GetByZipcode(92612));
            }
    
    其中DealService.GetByZipcode基本上只是将DealRepository.GetByZipcode(92612)映射到模型类并返回映射结果

    DealRepository.GetByZipcode方法大致如下:

    public static DealEntity GetByZipcode(string zip)
    {
                LinqToDealsDataContext db = new LinqToDealsDataContext();
                XElement xmlTree = XElement.Parse("<Request><ZipCode>" + zip + "</ZipCode></Request>");
    
                var deals = db.spSearchDeals(xmlTree);
    
                return deals;
            }
    
    publicstaticdealentity GetByZipcode(字符串zip)
    {
    LinqToDealsDataContext db=新的LinqToDealsDataContext();
    XElement xmlTree=XElement.Parse(“+zip+”);
    var deals=db.spSearchDeals(xmlTree);
    退货交易;
    }
    
    DealEntity类就是Linq为您的表提供的任何内容

    原因是: 这种结构的原因如下:

    a。所有数据访问代码都位于一个位置:DealRepository。您可以独立于其他内容来测试和调试它

    b。映射代码都在一个地方:DealService。您可以独立于其他内容来测试和调试它

    c。换言之,您需要适当地分离您的关注点

    现有代码的问题正是没有将关注点分开。也就是说,你用了一点MVC,然后把它放进了一个食品加工机,结果遇到了一大堆问题,这些问题比他们需要的要难处理得多

    您的模型混合到控制器中,没有存储库,没有服务层

    因此,请稍等片刻,花点时间阅读史蒂夫·桑德森的书

    我也会尝试建模一个更简单的问题。即使在好天气,xml解析也会让我头疼

    注:
    您可以认真改进您的命名约定。LINQTodelSDataContext?你在开玩笑吧?

    在你的学习曲线中添加以下项目:

  • 存储库模式

  • 问自己以下问题:为什么我需要一个服务层

  • 读史蒂文·桑德森的书。它教你用MVC思考

  • 上述内容适用于您的问题,因为您的问题显然与控制器中的代码相关,这些代码应该在您的模型中(即,数据访问代码应该在存储库类中)。也就是说,你不是在用MVC思考

    您的模型应该包括必要的存储库类,例如DealRepository。

    您需要一个服务类来将存储库从数据库中挖掘出来的对象映射到模型类:这样,转换问题就会被封装到服务层代码中。

    如果执行此操作,则可以在控制器中写入:

    public ActionResult Index()
            {
                LinqToDealsDataContext db = new LinqToDealsDataContext();
                XElement xmlTree = XElement.Parse("<Request><ZipCode>92612</ZipCode></Request>");
    
                var deals = db.spSearchDeals(xmlTree);
    
                return View(deals);
            }
    
    public ActionResult Index()
            {
                return(DealService.GetByZipcode(92612));
            }
    
    其中DealService.GetByZipcode基本上只是将DealRepository.GetByZipcode(92612)映射到模型类并返回映射结果

    DealRepository.GetByZipcode方法大致如下:

    public static DealEntity GetByZipcode(string zip)
    {
                LinqToDealsDataContext db = new LinqToDealsDataContext();
                XElement xmlTree = XElement.Parse("<Request><ZipCode>" + zip + "</ZipCode></Request>");
    
                var deals = db.spSearchDeals(xmlTree);
    
                return deals;
            }
    
    publicstaticdealentity GetByZipcode(字符串zip)
    {
    LinqToDealsDataContext db=新的LinqToDealsDataContext();
    XElement xmlTree=XElement.Parse(“+zip+”);
    var deals=db.spSearchDeals(xmlTree);
    退货交易;
    }
    
    DealEntity类就是Linq为您的表提供的任何内容

    原因是: 这种结构的原因如下:

    a。所有数据访问代码都位于一个位置:DealRepository。您可以独立于其他内容来测试和调试它

    b。映射代码都在一个地方:DealService。您可以进行测试和调试