C# 如何在.net核心项目中添加视图路由?

C# 如何在.net核心项目中添加视图路由?,c#,asp.net-mvc,asp.net-core,.net-core,C#,Asp.net Mvc,Asp.net Core,.net Core,我创建了一个.Net核心Web API程序。我想给它添加一个视图。在同一个项目下,我添加了一个“视图”文件夹。在HomeController中,我正在路由所有API请求,我创建了以下内容: [HttpGet("view")] public IActionResult Index() { return View(); } 在我的视图文件夹中,我创建了一个文件夹“Home”,并在其中添加了“Index.cshtml” 当我启动API并导航到“./view”时

我创建了一个
.Net核心Web API
程序。我想给它添加一个视图。在同一个项目下,我添加了一个“视图”文件夹。在HomeController中,我正在路由所有API请求,我创建了以下内容:

[HttpGet("view")]
    public IActionResult Index()
    {
        return View();
    }
在我的视图文件夹中,我创建了一个文件夹“Home”,并在其中添加了“Index.cshtml”

当我启动API并导航到“./view”时,我会进入
返回视图()行,但随后返回500个内部服务器错误

这就是我不喜欢MVC惯例的“自动”方法的地方。如果约定不起作用,我不知道在哪里将视图链接到控制器

更新,这可能是我的第一步行动。 我在Controllers文件夹中添加了一个新类,并在VS2015中使用了MVC控制器模板。然后我添加了一个视图来匹配,但它仍然无法自动工作

为了清楚起见,我的项目是:
ASP.NET核心Web应用程序(.NET核心)
,带有
Web API
模板。我有一个“Jobs”控制器类,它在一开始被添加为“Values”,我重命名了它。然后我添加了一个名为“HomeController”的
MVC控制器类
,唯一的方法是“Index”。我添加了一个名为“Views”的文件夹和一个名为“Home”的子文件夹,并添加了一个名为“Index.cshtml”的
MVC视图页面


我尝试在Index方法中使用“return View();”,但没有成功。然后我尝试在Index方法上方添加[Route(“Home/Index”)]。无论哪种方式,URL都会让我到达“return View();”的断点,但它永远不会返回视图。

在开发路由约定时,我花了令人沮丧的很长时间才了解它,但在一些版本中它似乎已经正常化了。在MVC:中查看有关该主题的本教程文档,它可能是基于MVC而不是WebCoreAPI的。如果您有针对Web核心API的更好的文档,请使用它

这篇
ASP.NET
WebCore教程文档对您似乎要做的事情有一些好处。具体而言,标题为“待办事项”的部分包含以下代码:

[HttpGet("{id}", Name = "GetTodo")]
public IActionResult GetById(long id)
{
    var item = _todoRepository.Find(id);
    if (item == null)
    {
        return NotFound();
    }
    return new ObjectResult(item);
}
考虑到MVC路由经验的一些度量,它看起来与您的方法特别不同,因为使用的HTTP谓词注释成员属性值是一个查询参数

鉴于我在猜测使用的是已知的非验证性,我仍然认为您需要修复属性路由,并可能返回ObjectResult而不是视图,正如NightOwl888所建议的那样。服务器错误可能还有更多有用的信息以及异常消息

编辑:对不起,我可能误解了你的问题。如果您试图构建一个服务于动态网页的应用程序,而不是一个服务于数据对象结果的WebAPI,那么本教程(类似于我前面提到的“构建web API”教程)可能会给出您的应用程序结构问题的答案。如果您试图同时执行这两项操作,您可能应该从MVC Web App结构开始,或者使用两个单独的项目。

我完成这项工作的(唯一)方法是将路径声明为操作的一个属性-与您所做的相同,但格式如下(控制器/操作):


注意:在Web API项目中返回视图有点奇怪,Web API项目应该返回一些数据结构,比如使用return new JsonResult(这里是您的json)返回json

注意2:您需要Microsoft.AspNetCore.Mvc框架(与Web API模板一起安装)

无论如何,在asp.net核心应用程序中配置路由有不同的方法:

  • 创建和扩展默认路由
配置方法中的路由配置示例:

  • 使用属性
如果使用属性配置路由,请不要忘记控制器的属性:

路由/索引示例:

路由/主/索引示例:

路由/iputwhatiwant/actionnameiwant的示例:

返回视图的.NET Core Web API项目的我的屏幕:


有关更多信息,官方文档有很好的文档记录:

您是如何从Windows命令行运行此Web应用程序的?。。。你能给我们详细的HTTP500错误信息吗。它可能会揭示一些不同于路由错误的东西,因为这通常会给出404

[Route("[controller]")]
public class HomeController : Controller
注意路线定义中的自动“[controller]”,我认为它现在是必要的

我缺少:

“保留编译上下文”:true


在myproject.json的构建选项中,“自动”方法稍微难学一点,但好处是您需要维护的代码要少得多,因为应用程序是由约定驱动的。我不确定这是否适用于.NET core,但在以前的版本中,您永远不会从WebAPI控制器返回视图-视图严格适用于MVC。WebAPI希望您返回某种数据结构,最终将产生XML或JSON,而不是视图。@NightOwl888我理解,我知道我不应该这样做,如果您阅读我的更新,您将看到我添加了一个MVC控制器,但它仍然不工作。您能显示index.cshtml的内容吗?请参阅我的答案,不要忘记控制器上的[Route(“”),您应该实现异常日志记录,以了解应用程序上发生了哪些异常;)我真的只是想添加一个主页,列出我所有的API。我并不想让它成为一个完整的MVC网页。我想我只部署过和MVC页面,所以我不知道如何在这个API程序中设置默认的html主页。我试图使用API中的“路由”知识和命名控制器/视图的约定来实现这一点。无论哪种方式,我都可以访问我的
returnview()
st
app.UseMvc(routes =>
{
           // You can add all the routes you need here

           // And the default route :
           routes.MapRoute(
                name: "default_route",
                template: "{controller}/{action}/{id?}",
                defaults: new { controller = "Home", action = "Index" }
           );
});
[Route("")]
public class HomeController : Controller
{
     [HttpGet]
     [Route("[action]")]
     public IActionResult Index()
     {
        return View();
     }
}
[Route("[controller]")]
public class HomeController : Controller
{
     [HttpGet]
     [Route("[action]")]
     public IActionResult Index()
     {
        return View();
     }
}
[Route("iputwhatiwant")]
public class HomeController : Controller
{
     [HttpGet]
     [Route("actionnameiwant")]
     public IActionResult Index()
     {
        return View();
     }
}
[Route("[controller]")]
public class HomeController : Controller