【发布时间】:2020-08-20 20:04:14
【问题描述】:
错误:
我想替换 Request.IsAuthenticated,因为我有不同的注册和登录方法来标准模板。我想用 bool 替换,我也尝试过使用 int,如下面的代码所示。
这是我使用 bool Authenticated 的 AccountController.cs 登录方法:
//GET: Account/LoginTurist (new)
[HttpGet]
[AllowAnonymous]
public ActionResult LoginTurist()
{
return View();
}
//POST: Account/LoginTurist (new)
[HttpPost]
[AllowAnonymous]
public ActionResult LoginTurist(LoginVM obj)
{
bool userExists = db.Users.Any(u => u.Username == obj.Username && u.Password == obj.Password);
var viewModel = new LoginVM { Authenticated = Request.IsAuthenticated };
//var viewModel = new LoginVM { Authenticated = 0 };
if (userExists)
{
Session["UseId"] = db.Users.Single(x => x.Username == obj.Username).Id;
viewModel.Authenticated = true;
//viewModel.Authenticated = 1;
return RedirectToAction("Experiences", "Home");
}
// in case of incorect email or password
ViewBag.LoginMessage = "Nume utilizator sau parola incorecte!";
return View(viewModel);
}
这是模型LoginVM:
namespace TuristWithComments.ViewModels
{
public class LoginVM
{
[Required]
[Display(Name = "Nume Utilizator")]
public string Username { get; set; }
[Required, DataType(DataType.Password)]
[Display(Name = "Parola")]
public string Password { get; set; }
[Display(Name = "Recunoaste dispozitivul?")]
public bool RememberMe { get; set; }
public bool Authenticated { get; set; }
//public int Authenticated { get; set; }
}
}
这是视图,LoginPartial.cshtml,我试图像这样替换 Request.IsAuthenticated:
@*@using Microsoft.AspNet.Identity*@
@*@if (Request.IsAuthenticated)*@
@model TuristWithComments.ViewModels.LoginVM
@if (Model.Authenticated)
{
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
<ul class="nav navbar-nav navbar-right">
<li>
@*@Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })*@
</li>
<li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
</ul>
}
}
else
{
<ul class="nav navbar-nav navbar-right">
@*<li>@Html.ActionLink("Inregistrare", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li>*@
@*<li>@Html.ActionLink("Autentificare", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li>*@
<li>@Html.ActionLink("Inregistrare", "RegisterTurist", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li>
<li>@Html.ActionLink("Autentificare", "LoginTurist", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li>
</ul>
}
我可以理解 Model.Authenticated 为空(参见第一张图片),但我究竟在哪里可以解决这个问题? Request.IsAuthenticated 从一开始就是 false 这就是程序在启动时运行的原因。 如何修复模型不为空?
或者有没有更好的不同方式来改变导航栏,你会用另一种方式吗?
后期编辑: 在网上搜索更多答案后,我看到很多关于“Web.config”的提及,女巫我没有做任何修改,看起来像这样:
<system.web>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
</system.web>
这可能是关键吗?也许我需要在这里修改一些东西?
Later Edit 2,在 David 的评论之后: LoginPartial 视图是 NavigationBar 的一部分,女巫在默认布局(或主布局,如果您愿意)中,所有页面都在其中呈现,理论上是您运行项目时打开的第一件事,不是吗?! 这是布局页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
<!--Lightbox for popup images-->
<link href="~/Content/lightbox.css" rel="stylesheet" />
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
@Html.ActionLink(" ", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Acasa", "Index", "Home")</li>
<li>@Html.ActionLink("Recomandarile noastre", "Recommendations", "Home")</li>
<li>@Html.ActionLink("Experientele utilizatorilor", "Experiences", "Home")</li>
<li>@Html.ActionLink("Fii spontan!", "Spontaneous", "Home")</li>
<li>@Html.ActionLink("Contacteaza-ne", "Contact", "Home")</li>
<li>@Html.ActionLink("Despre noi", "About", "Home")</li>
</ul>
@Html.Partial("_LoginPartial") // <-- here it is
</div>
</div>
</div>
<div style="padding: 7px">
<img src="~/Content/Images/_banner7.png" class="img-responsive" />
</div>
<div class="panel panel-body">
<div class="col-md-2">
<!--Partial view for the sidemenu-->
@Html.Partial("_SideMenu")
</div>
<div class="col-md-10">
<div>
@RenderBody()
</div>
</div>
</div>
@*<hr />*@
<div class="container body-content">
<footer>
<p>© @DateTime.Now.Year - TuristWithComments in Banat by Ionut Guruian</p>
</footer>
</div>
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", false)
<!--Lightbox for popup images-->
<script src="~/Scripts/lightbox-2.6.js"></script>
</body>
</html>
此外,该操作确实有一个 GET,我在第一个代码 sn-p 中也添加了它。
而用户将其凭据用于登录的 LoginTurist.cshtml 就是这里:
@using TuristWithComments.Models
@model TuristWithComments.ViewModels.LoginVM
@*@model LoginViewModel*@
@{
ViewBag.Title = "Autentificare";
}
<h2>@ViewBag.Title.</h2>
<div class="row">
<div class="col-md-8">
<section id="loginForm">
@using (Html.BeginForm("LoginTurist", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Autentificare</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Username, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Username, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
</div>
</div>
@*<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<div class="checkbox">
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe)
</div>
</div>
</div>*@
<h5 class="text-danger" style="padding-left:20%">@ViewBag.LoginMessage</h5>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Autentificare" class="btn btn-success" />
</div>
</div>
<p>
@Html.ActionLink("Inregistrare cont nou", "RegisterTurist")
</p>
}
</section>
</div>
<div class="col-md-4">
<section id="socialLoginForm">
@Html.Partial("_ExternalLoginsListPartial", new ExternalLoginListViewModel { ReturnUrl = ViewBag.ReturnUrl })
</section>
</div>
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
【问题讨论】:
标签: asp.net model-view-controller replace request boolean