代码之家  ›  专栏  ›  技术社区  ›  loremIpsum1771

引用控制器路由时出错

  •  0
  • loremIpsum1771  · 技术社区  · 6 年前

    我有一个ASP.NET核心MVC应用程序,用户可以在其中搜索要购买的项目。在这个过程中,有一个搜索页面返回一个表中的结果列表,表中的每个项目都链接到一个详细信息页面。带有表的搜索页的逻辑和详细信息页的逻辑都包含在一个控制器中。在详细信息页面上,我有一个“添加到购物车”按钮,用户可以单击该按钮。此按钮链接到一个单独的控制器(用于购物车),而不是用于“实际详细信息”页的控制器。

    出于某种原因,当我输入购物车控制器操作的URL时,出现以下错误:

    InvalidOperationException: Unable to resolve service for type 'Models.ResortDataJoinObj' while attempting to activate 'Controllers.ShoppingCartController'.
    

    这里讨论的模型被用于在控制器中存储数据,该控制器将被发送到视图。模型在另一个控制器中使用时工作正常,所以我不确定这里的问题是什么。但出于某种原因,当我在详细信息视图中单击“添加到购物车”按钮时,服务器找不到该页面。 是什么导致了这些问题?

    相关代码如下:

    Starup.cs中的路线

    app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=resortDeals}/{action=Index}/{id?}");
                    routes.MapRoute(
                      name: "shoppingcart",
                      template: "{controller=ShoppingCart}/{action=Index}/{id?}");
                });
    

    相关控制器动作

        public class ShoppingCartController : Controller
        {
    public ShoppingCartController(ResortDataJoinObj resortDataJoinObj, ShoppingCart shoppingCart)
                {
                    _shoppingCart = shoppingCart;
                    _resortDataJoinObj = resortDataJoinObj;
    
                }
         [Route("shoppingcart")]
        public ViewResult Index()
        {
            ...
        }
        [Route("ShoppingCart/AddToShopingCart/")]
        public RedirectToActionResult AddToShopingCart(int dealId)
        {
             var selectedDeal = (from rd in _db.ResortData
                                    join ra in _db.ResortAvailability on rd.RecNo equals ra.RecNoDate
                                    where Convert.ToInt32(rd.RecNo) == id
                                    select new ResortDealResultsObject
                                    {
                                        Name = rd.Name,
                                        ImageUrl = rd.ImageUrl,
                                        ResortDetails = rd.ResortDetails,
                                        RecNo = rd.RecNo,
                                        CheckIn = ra.CheckIn,
                                        Address = rd.Address,
                                        TotalPrice = ra.TotalPrice
    
                                    }
                                    );
                ResortDataJoinObj dealJoinObj = new ResortDataJoinObj();
                List<ResortDealResultsObject> selectedDealList = new List<ResortDealResultsObject>();
                foreach (var row in selectedDeal)
                {
                    //An example of only selecting certain results
                    // if (row.Name == "John" && row.TotalPrice > 15)
                    // {
                    var tempVm = new ResortDealResultsObject
                    {
                        Name = row.Name,
                        ImageUrl = row.ImageUrl,
                        ResortDetails = row.ResortDetails,
                        RecNo = row.RecNo,
                        CheckIn = row.CheckIn,
                        Address = row.Address,
                        TotalPrice = row.TotalPrice
                    };
                    selectedDealList.Add(tempVm);
                    //}
                }
                dealJoinObj.ResDealList = selectedDealList;
                if (selectedDeal != null)
                {
                    _shoppingCart.AddToCart(dealJoinObj);
                }
                return RedirectToAction("Index");
        }
    }
    
    public class resortDealsController : Controller
        {
    
      public IActionResult Index()
            {
            }
     public async Task<IActionResult> Details(string id)
            {
            }
       }
    

    详细信息视图:

    @model Models.ResortDealDetailObject
    @{
        ViewData["Title"] = "Details";
    }
    
    <h2>Details</h2>
    
    <div>
        @Model.Name
    
        @Model.Address
    
        @Model.ResortDetails
    </div>
    
    @Html.Partial("AddToShoppingCart", @Model)
    

    局部视图:

     <div class="addToCart text-right">
            <p class="button ">
                @*<a class="btn btn-success" id="cartButton" asp-controller="ShoppingCart" asp-action="AddToShoppingCart" asp-route-id="@Model.RecNo">
                    Add to cart
                </a>*@
                <button class="btn btn-success" onclick="search(@Model.RecNo)">
                    Add to cart
                </button>
            </p>
        </div>
    </form>
    
    <script>
        function addToCart(recNo) {
            document.getElementById('cartForm').action = "/ShoppingCart/AddToShoppingCart/" + recNo;
            document.getElementById('cartForm').submit();
        }
    </script>
    

    度假酒店数据联接对象:

    public class ResortDataJoinObj
        {
            public ResortData ResData { get; set; }
            public ResortAvailability ResAvail { get; set; }
            public string priceLowEnd { get; set; }
            public string priceHighEnd { get; set; }
            public List<ResortDealResultsObject> ResDealList { get; set; }
            public ResortDealDetailObject detailObject { get; set; }
            public ResortDealResultsObject resortDeal { get; set; }
        }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   mvermef    6 年前

    一些在线答案

       // could be [Route("[controller]/[action]") or it could left off all together
       [Route("[controller]")]  
       public class ShoppingCartController : Controller
       {
          public ShoppingCartController(ShoppingCart shoppingCart)
          {
             _shoppingCart = shoppingCart;
          }
    
          // your default route...
          public IActionResult Index()
          {
            ...
           }
        [HttpGet("{id}")] //not entirely necessary either (more of a partially forced route)
         public RedirectToActionResult AddToShoppingCart(int id)
         {
            //since routes are exact missing something like {id} would cause
            //route generator to skip any calls to this without the {id} in place.
         }
      }
    

    这应该有效…由于您有一些不包括ID的东西,那么路由与您在路由图中所写的不匹配,因此您将体验到当前看到的内容。

    查看您从YouTube视频中收集到的信息,我访问了他的存储库以查看示例。他实际上有购物车(参考 startup.cs )作用域使其通过IOC容器以任何形式(每个单独的购物车,即当前填充的购物车)存在。

    还请记住,有些配置现在会有所不同,因为存储库中大约有2个.NET核心版本,而有些2.1版本的配置与不使用的配置大不相同。 project.json 例如引用程序集。