我具备成为一个非常标准的控制器的能力:
这是控制器的定义(有点依赖注入,但是是标准的):
public class SeriesController : Controller
{
private readonly IHostingEnvironment _env;
public SeriesController(IHostingEnvironment env)
{
_env = env;
}
[HttpGet("/series/{id:int?}/{title?}")]
public IActionResult Index(int id, string title)
{
if (id > 0)
{
var populateSeriesItem = new PopulateSeriesItem(_env, new SqlConnection());
var seriesItem = populateSeriesItem.GenerateSeriesItem(id);
//...
如果id不存在(或0),则显示所有记录;如果大于等于1,则显示一条记录。 (这就是客户想要的!)
我这样称呼它:
https://localhost/series/3/title
或
但问题是id始终为0(标题为null)。
就是这种情况,如果我在网址栏中输入它或手动指定id(即/ series?id = 3)
我只是无法弄清我的缺失。
完全相同的设置可以与其他控制器完美配合。
[HttpGet("/books/{id:int?}/{title?}")]
public ActionResult Index(int id, string title)
{
if (id > 0)
{
var populateBookItem = new PopulateBookItem(new SqlConnection(), _env);
var bookItem = populateBookItem.GenerateBookItem(id);
那个有效。
这是路由配置(只是标准配置):
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
我肯定想念一些明显的东西,但是我很困惑!
任何建议都非常感谢。
更新:
我已经剥离了控制器的所有功能。我只是将其传递给视图。
这有效:https://localhost:44319/series/14/megacities-该视图报告ID = 14。
这有效:https://localhost:44319/series/5/megacities-该视图报告ID = 5
这有效:https://localhost:44319/series/14/business-with-china-该视图报告ID = 14。
这不起作用:https://localhost:44319/series/5/business-with-china-转到https://localhost:44319/series/0。
还有其他遵循相同模式的URL。有些有效,有些无效。
如果我除去title参数,它们似乎都可以工作。
我不知道为什么!
答案 0 :(得分:1)
routes.MapRoute
,对于Web API来说是不必要的。[HttpGet("/books/{id:int?}")]
api/books/5?title=abc
[HttpGet("/books/{id:int?}")]
public ActionResult Index(int id, [FromQuery] string title)
{
//code here
}
答案 1 :(得分:1)
我遇到了同样的问题,所以我找到了此链接。我无意间找到了解决问题的方法,所以我什至与您都没有关系,我把它发布给任何来这里和我有同样问题的人。 我正在使用C#和.net Core 2.2 无论我做什么,我都将id值设为0。 碰巧,我选择的参数名称是页号“ page”,需要与{id?}
中指定的名称相同。答案 2 :(得分:0)
感谢大家的帮助。
我已经解决了这个问题,尽管我不知道是什么原因造成的。 (我认为这可能是浏览器缓存问题。)
无论如何,我重新启动了服务器,现在一切正常。
答案 3 :(得分:0)
如果名称不匹配,则参数将解析为默认值-如果为数字则为0,否则为null 在下面的示例中,URL具有param1,而该方法的参数名称为param2。
[HttpGet("/foo/{param1}")]
public ActionResult Foo(int param2)
{
//code here
}