我创建了一个.Net Core Web API
程序。我想为它添加一个视图。在同一个项目中,我添加了一个" Views"夹。在我控制所有API请求的HomeController中,我创建了以下内容:
[HttpGet("view")]
public IActionResult Index()
{
return View();
}
在我的Views文件夹中,我创建了一个文件夹" Home"并添加了#34; Index.cshtml"它。
当我启动API时,导航到" ../ view"我到达return View();
行,但它返回500内部服务器错误。
这就是我不喜欢的" automagical" MVC惯例的方法。如果约定不起作用,我不知道在哪里将视图链接到控制器。
更新,这可能应该是我的第一步。 我在Controllers文件夹中添加了一个新类,并在VS2015中使用了MVC Controller模板。然后我添加了一个匹配的视图,它仍然没有自动运行。
为清楚起见,我的项目是ASP.NET Core Web Application(.NET Core)
,其中包含Web API
模板。我有一个"乔布斯"在开始时添加的控制器类为'值'我改名了。然后我添加了MVC Controller Class
名为" HomeController"唯一的方法是"索引"。我添加了一个名为" Views"的文件夹。和一个名为" Home"的子文件夹,并添加了MVC View Page
名为" Index.cshtml"。
我尝试使用"返回View();"在Index方法中,没有用。然后我尝试在Index方法上面添加[Route(" Home / Index")]。无论哪种方式,URL都会让我到达我的断点#34;返回View();"但它永远不会返回视图。
答案 0 :(得分:4)
注意:你想在Web API项目中返回一个视图有点奇怪,一个Web API项目应该返回一些数据结构,比如json使用返回新的JsonResult (your_json_here)例如。
注2:您需要 Microsoft.AspNetCore.Mvc 框架(随Web API模板一起安装)
无论如何,您有不同的方法在asp.net核心应用程序中配置路由:
配置方法中的路由配置示例:
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" }
);
});
如果使用属性配置路由,请不要忘记控制器的路由:
路线 / index 的示例:
[Route("")]
public class HomeController : Controller
{
[HttpGet]
[Route("[action]")]
public IActionResult Index()
{
return View();
}
}
路线 / home / index 的示例:
[Route("[controller]")]
public class HomeController : Controller
{
[HttpGet]
[Route("[action]")]
public IActionResult Index()
{
return View();
}
}
路线 / iputwhatiwant / actionnameiwant 的示例:
[Route("iputwhatiwant")]
public class HomeController : Controller
{
[HttpGet]
[Route("actionnameiwant")]
public IActionResult Index()
{
return View();
}
}
我的.NET Core Web API项目屏幕返回一个视图:
有关更多信息,官方文档已有详细记录:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing
答案 1 :(得分:1)
在开发过程中学习路由约定花费了很长时间,但似乎已经针对少数版本进行了规范化。查看有关MVC主题的本教程文档:Attribute Routing in ASP.NET MVC 5,它可能是MVC而非WebCoreAPI。如果您有更好的Web Core API文档,请使用它。
这个ASP.NET
Web核心Build a web API教程文档对于您似乎想要做的事情有一些好处。具体来说,标题“Get-do items”部分具有以下代码:
[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,那么这个Build an MVC Web App教程,类似于我之前提到的“构建Web API”教程,可能会出现您的应用程序结构问题回答。如果您尝试两者,您应该从MVC Web App结构开始,或者使用两个单独的项目。
答案 2 :(得分:1)
你是如何从Windows命令行运行这个webapp的?...你能给我们详细的HTTP500错误吗?它可能会揭示与路由错误不同的东西,因为它通常会产生404。
[Route("[controller]")]
public class HomeController : Controller
注意Route定义中的自动“[controller]”,我认为现在是必要的
答案 3 :(得分:0)
我得到这个工作的(唯一)方法是将路径声明为动作的属性 - 就像你做的那样,但格式如下(Controller / Action):
[HttpGet("Home/Index")]
public IActionResult Index()
{
return View();
}
答案 4 :(得分:0)
我失踪了:
"preserveCompilationContext": true
在我的project.json
的构建选项中