C# 引用控制器路由时出错
我有一个ASP.NET核心MVC应用程序,用户可以在其中搜索要购买的项目。在此过程中,有一个搜索页面,返回表中的结果列表,其中表中的每个项目都链接到详细信息页面。带有表的搜索页面的逻辑和详细信息页面的逻辑都包含在一个控制器中。在“详细信息”页面上,我有一个“添加到购物车”按钮,用户可以单击该按钮。此按钮链接到一个单独的控制器(用于购物车),而不是用于实际详细信息页面的控制器 出于某种原因,当我键入购物车控制器操作的url时,出现以下错误:C# 引用控制器路由时出错,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我有一个ASP.NET核心MVC应用程序,用户可以在其中搜索要购买的项目。在此过程中,有一个搜索页面,返回表中的结果列表,其中表中的每个项目都链接到详细信息页面。带有表的搜索页面的逻辑和详细信息页面的逻辑都包含在一个控制器中。在“详细信息”页面上,我有一个“添加到购物车”按钮,用户可以单击该按钮。此按钮链接到一个单独的控制器(用于购物车),而不是用于实际详细信息页面的控制器 出于某种原因,当我键入购物车控制器操作的url时,出现以下错误: InvalidOperationException: U
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)
{
}
}
公共类ShoppingCartController:控制器
{
公共ShoppingCartController(ResortDataJoinObj ResortDataJoinObj,ShoppingCart ShoppingCart)
{
_shoppingCart=shoppingCart;
_RestortDataJoinObj=RestortDataJoinObj;
}
[路线(“购物车”)]
公共视图结果索引()
{
...
}
[路线(“ShoppingCart/AddToShoppingCart/”)
public RedirectToActionResult AddToShopingCart(int dealId)
{
var selectedDeal=(来自数据库数据中的rd)
将ra加入到rd.RecNo上的_db.restorAvailability等于ra.RecNoDate
其中Convert.ToInt32(rd.RecNo)==id
选择新的DealResultsObject
{
Name=rd.Name,
ImageUrl=rd.ImageUrl,
ResortDetails=rd.ResortDetails,
RecNo=rd.RecNo,
签入=ra.签入,
地址=rd地址,
TotalPrice=ra.TotalPrice
}
);
RestortDataJoinObj dealJoinObj=新的RestortDataJoinObj();
List selectedDealList=新建列表();
foreach(selectedDeal中的变量行)
{
//仅选择某些结果的示例
//如果(row.Name==“John”&&row.TotalPrice>15)
// {
var tempVm=新的ResortDealResultsObject
{
Name=row.Name,
ImageUrl=row.ImageUrl,
RestorDetails=行。RestorDetails,
RecNo=行。RecNo,
签入=行。签入,
地址=行。地址,
TotalPrice=行。TotalPrice
};
选择DealList.Add(临时虚拟机);
//}
}
dealJoinObj.ResDealList=selectedDealList;
如果(selectedDeal!=null)
{
_shoppingCart.AddToCart(dealJoinObj);
}
返回操作(“索引”);
}
}
公共类控制器:控制器
{
公共IActionResult索引()
{
}
公共异步任务详细信息(字符串id)
{
}
}
详细信息视图:
@model Models.ResortDealDetailObject
@{
ViewData["Title"] = "Details";
}
<h2>Details</h2>
<div>
@Model.Name
@Model.Address
@Model.ResortDetails
</div>
@Html.Partial("AddToShoppingCart", @Model)
@model Models.dealDetailObject
@{
ViewData[“标题”]=“详细信息”;
}
细节
@型号.名称
@型号.地址
@模型.详细信息
@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>
函数addToCart(recNo){
document.getElementById('cartForm').action=“/ShoppingCart/AddToShoppingCart/”+recNo;
document.getElementById('cartForm').submit();
}
度假村数据连接对象:
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; }
}
datajoinobj公共类
{
公共数据ResData{get;set;}
公共可用性重新利用{get;set;}
公共字符串priceLowEnd{get;set;}
公共字符串priceHighEnd{get;set;}
公共列表ResDealList{get;set;}
公共对象dealDetailObject detailObject{get;set;}
公共ResortDealResultsObject resortDeal{get;set;}
}
一些在线答案
// 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视频中获得的信息,我访问了他的存储库以查看示例。实际上,他已经对ShoppingCart(参考startup.cs
)进行了范围限定,以便通过IOC容器以任何形式(每个单独的购物车,当前已装满)进行操作
另外请记住,一些配置现在会有所不同,因为存储库大约有2个版本的.net core,而2.1版本的一些东西则大不相同,比如不使用project.json
来引用程序集。一些答案是内联的
// 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
)sc