ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost

我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET、POST等)。

 

那么默认情况下如果我们没有给Controller的Action声明任何标签,那Action支持的是什么类型的Http请求呢?

为此我们新建一个ASP.NET Core MVC项目,并且新建一个HomeController,它有两个Action,如下所示:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
        
    public object ShowData()
    {
        return new { Message="Good job!" };
    }
}

其中ShowData这个Action会返回一个Json对象,用来响应从客户端浏览器发送过来的Ajax请求,也就是Http请求。

 

此外我们给HomeController的Index这个Action定义了一个视图Index.cshtml,如下所示:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script type="text/javascript" src="~/lib/jquery/dist/jquery.js"></script>
    <script type="text/javascript">
        $(function (){
            $("#btnPost").click(function () {
                $.ajax({
                    type: "POST",
                    cache: false,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    url: "/Home/ShowData",
                    data: {},
                    success: function (data) {
                        alert(data.message);
                    },
                    error: function (xhr, ts, et) {
                        alert("Error");
                    }
                });
            });

            $("#btnGet").click(function () {
                $.ajax({
                    type: "GET",
                    cache: false,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    url: "/Home/ShowData",
                    data: {},
                    success: function (data) {
                        alert(data.message);
                    },
                    error: function (xhr, ts, et) {
                        alert("Error");
                    }
                });
            });
        });
    </script>
</head>
<body>
    <div>
        <button id="btnPost">Post</button>
    </div>
    <div>
        <button id="btnGet">Get</button>
    </div>
</body>
</html>

该视图上,两个Html按钮btnGet和btnPost,分别用来向HomeController的ShowData这个Action,发送GET和POST类型的Ajax请求。

如果 Ajax请求成功被ShowData这个Action响应,那么页面会输出ShowData返回的message值“Good job!”。

如果 Ajax请求没有被ShowData这个Action响应,那么页面会输出错误消息“Error”。

 

下面我们就来测试下:

访问Url地址Home/Index,在浏览器中先点击页面上的btnGet按钮,发送GET请求,结果如下:

然后在浏览器中点击页面上的btnPost按钮,发送POST请求,结果如下:

 

可以看到当我们没有给HomeController中的ShowData这个Action上声明任何特性标签的时候,实际上就相当于既声明了HttpGet特性标签,又声明了HttpPost特性标签,ShowData会同时响应两种类型的Http请求,相当于如下代码:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [HttpGet]
    [HttpPost]
    public object ShowData()
    {
        return new { Message = "Good job!" };
    }
}

 

但是如果我们只给ShowData上声明一个Http特性标签,那么其就只会响应一种类型的Http请求了,例如如果我们现在在ShowData上只声明HttpPost特性标签,如下所示:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public object ShowData()
    {
        return new { Message = "Good job!" };
    }
}

那么现在点击视图Index.cshtml上的btnGet按钮,会显示如下结果:

 

可以看到GET类型的Ajax请求没有被ShowData响应,最后显示错误消息报错了。

 

转载于:https://www.cnblogs.com/OpenCoder/p/10316446.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 ASP.NET Core MVC 登录注册示例,包括使用 Identity 进行身份验证和管理用户的功能。 1. 首先,打开 Visual Studio 并创建一个新的 ASP.NET Core Web 应用程序。 2. 选择 ASP.NET Core Web 应用程序模板,并选择“Individual User Accounts”身份验证选项。 3. 在解决方案资源管理器,右键单击项目并选择“管理 NuGet 程序包”。 4. 在 NuGet 程序包管理器,搜索并安装以下包:Microsoft.AspNetCore.Identity.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer 和 Microsoft.EntityFrameworkCore.Tools。 5. 打开 Startup.cs 文件,并在 ConfigureServices 方法添加以下代码: ```csharp services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.Configure<IdentityOptions>(options => { // Password settings options.Password.RequireDigit = true; options.Password.RequiredLength = 8; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = true; options.Password.RequireLowercase = false; // Lockout settings options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30); options.Lockout.MaxFailedAccessAttempts = 10; options.Lockout.AllowedForNewUsers = true; // User settings options.User.RequireUniqueEmail = true; }); ``` 这段代码将添加 Identity 服务,并配置一些身份验证选项。 6. 在 Startup.cs 文件的 Configure 方法添加以下代码: ```csharp app.UseAuthentication(); ``` 这将启用身份验证间件。 7. 创建一个名为“AccountController”的新控制器,并添加以下代码: ```csharp public class AccountController : Controller { private readonly SignInManager<ApplicationUser> _signInManager; private readonly UserManager<ApplicationUser> _userManager; public AccountController( UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager) { _userManager = userManager; _signInManager = signInManager; } [HttpGet] public IActionResult Register() { return View(); } [HttpPost] public async Task<IActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } return View(model); } [HttpGet] public IActionResult Login() { return View(); } [HttpPost] public async Task<IActionResult> Login(LoginViewModel model) { if (ModelState.IsValid) { var result = await _signInManager.PasswordSignInAsync( model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { return RedirectToAction("Index", "Home"); } ModelState.AddModelError(string.Empty, "Invalid login attempt."); } return View(model); } [HttpPost] public async Task<IActionResult> Logout() { await _signInManager.SignOutAsync(); return RedirectToAction("Index", "Home"); } } ``` 这段代码将处理用户注册、登录和注销的逻辑。请注意,我们使用了一些视图模型,如 RegisterViewModel 和 LoginViewModel,这些模型将用于表单验证和数据绑定。 8. 创建一个名为“RegisterViewModel”的新模型,用于表单验证和数据绑定。以下是一个示例: ```csharp public class RegisterViewModel { [Required] [EmailAddress] [Display(Name = "Email")] public string Email { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 8)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } } ``` 9. 创建一个名为“LoginViewModel”的新模型,用于表单验证和数据绑定。以下是一个示例: ```csharp public class LoginViewModel { [Required] [EmailAddress] public string Email { get; set; } [Required] [DataType(DataType.Password)] public string Password { get; set; } [Display(Name = "Remember me?")] public bool RememberMe { get; set; } } ``` 10. 最后,创建视图文件以呈现注册和登录表单。例如,以下是一个简单的注册视图: ```html @model RegisterViewModel <h2>Register</h2> <form asp-action="Register" method="post"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="Email"></label> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Password"></label> <input asp-for="Password" class="form-control" /> <span asp-validation-for="Password" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="ConfirmPassword"></label> <input asp-for="ConfirmPassword" class="form-control" /> <span asp-validation-for="ConfirmPassword" class="text-danger"></span> </div> <button type="submit" class="btn btn-primary">Register</button> </form> ``` 这只是一个简单的示例,你可以根据自己的需要对其进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值