如何强制/设置MVC Core中所有操作的全局授权?
我知道如何注册全局过滤器 - 例如我有:
Setup.cs
services.AddMvc(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
});
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我无法为授权添加相同的内容:
options.Filters.Add(new AuthorizeAttribute());
我有错误:
Cannot convert from 'Microsoft.AspNet.Authorization.AuthorizeAttribute()' to 'System.Type'
(方法.Add()需要IFilterMetadata类型)
我知道 - 从类似的问题 - 这适用于MVC4-5 ......所以必须在MVC Core上改变...
有人有什么想法吗?
我正在从一本书中学习ASP.NET Core MVC,有问题的代码片段如下:
// CHAPTER 4 - ESSENTIAL C# FEATURES
namespace LanguageFeatures {
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services.AddMvc();
}
// etc.
Run Code Online (Sandbox Code Playgroud)
因为这本书是关于ASP.NET核心MVC而不是ASP.NET MVC,我认为我必须使用AddMvcCore()而不是AddMvc()如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvcCore(); // as opposed to:
//services.AddMvc();
}
Run Code Online (Sandbox Code Playgroud)
我在这里做的是正确的吗?
学习新事物需要投入时间,空间和精力.我目前正在学习Asp.Net Core MVC 2.0.此ASP.NET核心教程概述指出:
Razor Pages是使用ASP.NET Core 2.0创建Web UI的推荐方法.
这个信息使我无法决定是否必须停止学习Asp.net Core MVC并开始学习Asp.net Core Razor Pages.
欢迎任何指示.
asp.net asp.net-core-mvc asp.net-core razor-pages asp.net-core-mvc-2.0
据我所知,ASP.NET Core是一个模块化框架,它将ASP.NET MVC和Web API等技术整合到一个编程模型中.
但是,ASP.NET MVC 6的一个特性是将MVC 6和Web API的合并与以下特性结合在一起.依赖注入是内置的,是MVC的一部分.
1)并排 - 使用您的应用程序部署运行时和框架
2)与NuGet打包在一起的所有内容,包括.NET运行时本身.
3)基于JSON的新项目结构.
4)无需为每次更改重新编译.只需点击保存并刷新浏览器即可.
5)使用新的Roslyn实时编译器完成编译.
那么为什么有2个独立的ASP.NET框架呢?由于核心框架已经存在,以后不会使用MVC 6吗?
如果有人可以澄清,那会很棒.
我的项目中有一个通用存储库.请考虑以下控制器代码段
public class Lookup1Controller : Controller
{
readonly MyDbContext _db;
public Lookup1Controller(MyDbContext dataContext)
{
_db = dataContext;
}
public async Task<IActionResult> Index()
{
IGenericRepository<Lookup1> _repository = new GenericRepository<Lookup1>(_db);
var lookup1s = await _repository.SelectAll();
return View(lookup1s);
}
Run Code Online (Sandbox Code Playgroud)
我认为不需要在我的Generic存储库以及每个控制器中都有我的数据库引用.
我重构它:
public class Lookup1Controller : Controller
{
private IGenericRepository<Lookup1> _repository;
public Lookup1Controller(IGenericRepository<Lookup1> repository)
{
_repository = repository;
}
public async Task<IActionResult> Index()
{
var lookup1s = await _repository.SelectAll();
return View(lookup1s);
}
}
Run Code Online (Sandbox Code Playgroud)
从我读到的内容来看,它更简洁,也是ASP.NET 5的最佳实践.但如果我在浏览器中访问该控制器路径,我将收到以下错误:
InvalidOperationException: Unable to resolve service for type 'MyProject.Data.IGenericRepository`1[MyProject.Models.Lookup1]' while …Run Code Online (Sandbox Code Playgroud) 我一直试图通过使用TempData重定向后将数据传递给一个动作,如下所示:
if (!ModelState.IsValid)
{
TempData["ErrorMessages"] = ModelState;
return RedirectToAction("Product", "ProductDetails", new { code = model.ProductCode });
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,它失败了以下消息:
"
System.InvalidOperationException的Microsoft.AspNet.Mvc.SessionStateTempDataProvider'不能序列类型的对象'ModelStateDictionary'到会话状态".
我在Github的MVC项目中发现了一个问题,但是虽然它解释了为什么我收到这个错误,但我看不出什么是可行的替代方案.
一种选择是将对象序列化为json字符串,然后将其反序列化并重新构建ModelState.这是最好的方法吗?我需要考虑哪些潜在的性能问题?
最后,是否有任何替代方法可以序列化复杂对象或使用其他不涉及使用的模式TempData?
我正在尝试使用Razor视图中的标记帮助程序在ASP.NET MVC Core中创建一个带有枚举属性的下拉列表:
这是模型:
public class PersonalMember : Member
{
[Required, Display(Name = "First Name")]
public string FirstName { get; set; }
[Required, Display(Name = "Last Name")]
public string LastName { get; set; }
[EnumDataType(typeof(Gender))]
public Gender GenderType { get; set; }
}
public enum Gender
{
Male = 1,
Female = 2
}
Run Code Online (Sandbox Code Playgroud)
以下是视图中表单的一部分:
<div class="form-group">
<label asp-for="GenderType" class="col-md-2 control-label"></label>
<div class="col-md-10">
<select asp-for="GenderType" asp-items="Html.GetEnumSelectList<GenderType>()">
<option selected="selected" value="">Please select</option>
</select>
<span asp-validation-for="GenderType" class="text-danger" />
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,之后Html.GetEnumSelectList, …
我一直在努力Response.Body从ASP.NET核心操作中获取属性,而我能够识别的唯一解决方案似乎不是最佳的.该解决方案需要Response.Body在一段MemoryStream时间内将流读取到字符串变量中,然后在发送到客户端之前将其交换回来.在下面的示例中,我试图Response.Body在自定义中间件类中获取值. Response.Body是一个集在ASP.NET核心出于某种原因唯一的财产?我在这里遗漏了什么,或者这是一个疏忽/错误/设计问题?有更好的阅读方式Response.Body吗?
当前(次优)解决方案:
public class MyMiddleWare
{
private readonly RequestDelegate _next;
public MyMiddleWare(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
using (var swapStream = new MemoryStream())
{
var originalResponseBody = context.Response.Body;
context.Response.Body = swapStream;
await _next(context);
swapStream.Seek(0, SeekOrigin.Begin);
string responseBody = new StreamReader(swapStream).ReadToEnd();
swapStream.Seek(0, SeekOrigin.Begin);
await swapStream .CopyToAsync(originalResponseBody);
context.Response.Body = originalResponseBody;
}
}
}
Run Code Online (Sandbox Code Playgroud)
尝试使用EnableRewind()的解决方案:
这仅适用于Request.Body,而不是Response.Body.这导致从而Response.Body不是实际的响应主体内容中读取空字符串. …
使用dnx运行我的ASP.NET核心应用程序我能够从命令行设置环境变量,然后像这样运行它:
set ASPNET_ENV = Production
dnx web
Run Code Online (Sandbox Code Playgroud)
在1.0中使用相同的方法:
set ASPNETCORE_ENVIRONMENT = Production
dotnet run
Run Code Online (Sandbox Code Playgroud)
不起作用 - 该应用程序似乎无法读取环境变量.
Console.WriteLine(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"));
Run Code Online (Sandbox Code Playgroud)
返回null
我错过了什么?
我需要集成<script>到一些vue-momentMVC视图.我选择了Vue.js而不是其他选择,因为它似乎更简单: - " 只需通过vue-datetime-picker标签添加它们 "他们说.无需学习gulp/grunt/webpack/browserify/etc.
结果证明是错误的.在我第一次尝试处理日期时,我尝试了一些扩展,例如,require()或者'use babel'从这个与Vue.js相关的官方策划列表中获取,但是我在这里碰到了一堵墙.虽然第一个不是强制使用importsjs语法(¿ exports?),但第二个没有它就不起作用.其他扩展发生require()和require(stuff)/ <script>这是vue-moment需要进行编译.那么,大多数vue-datetime-picker库和工具确实需要编译器,require()语法和'use babel'世界上所有的东西?
我应该如何设置我的项目以使用ASP.NET Core MVC + Vue.js,这样我可以使用vue插件(可以imports)开发许多小的vue-apps ?
asp.net-core-mvc ×10
asp.net-core ×6
c# ×4
asp.net ×3
asp.net-mvc ×2
.net ×1
enums ×1
generics ×1
javascript ×1
razor-pages ×1
tempdata ×1
vue.js ×1