我有一个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)
{
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; }
}