我只是想知道如何为索引页上的某些条件if语句维护它。在我的索引页上,我有一个条件if语句集,如果admin用户为null,它将显示loginform,一旦按下submit,则该条件if语句不应再加载表单,而应显示主页和导航栏。
@if (ViewBag.Users == null)
{
using (Html.BeginForm("ValidateUser", "Home", FormMethod.Post,
new { @class =
"form-signin" }))
{
///set text to be centered horizontolly
<div class="text-center">
<img class="mb-4" src="~/images/people.svg" alt="" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal">Please sign in</h1>
@Html.TextBoxFor(m => m.UserEmail, new { @type = "email", id = "inputEmail", Name = "Email Address", @class = "form-control", placeHolder = "Email Address", autocomplete = "off", required = "required" })
@Html.TextBoxFor(m => m.Password, new { @type = "password", id = "inputPassword", Name = "Password", @class = "form-control", placeHolder = "Password", autocomplete = "off", required = "required" })
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</div>
}Html.EndForm();}
这是我的建议
[HttpPost][ActionName("ValidateUser")]
public IActionResult ValidateUser(Users user)
{
///check if modelstate is active once it is, retrieve the users
and add the new identity if it matches
if(ModelState.IsValid)
{
///simulating a database call for users
List<Users> admin = user.GetUsers();
if(admin.FirstOrDefault().UserEmail == user.UserEmail &&
admin.FirstOrDefault().Password == user.Password)
{
ViewBag.Users = user;
return RedirectToAction("Index");
}
}
return View(user);
}
我目前期望的结果是,当viewbag.users!= null时,表单根本不会显示
摘要:一旦我在表单上按Submit,它将进入ValidateUser操作以验证该人是否为管理员。然后将人员详细信息保存在Viewbag.Users中。因此,viewbag.Users不再为空,因此if语句不再起作用,但仍显示登录表单
回答:在请求之间不存在viewbag,因此使用viewtemp或cookie或查询
答案 0 :(得分:0)
原始问题的答案是:
否,您的ViewBag
值在重定向期间丢失。您将需要使用TempData在重定向之间保留您的值。重定向只是带有301、302或307状态码以及位置响应标头的空响应。该Location标头包含您要将客户端重定向到的URL。
但是
您可以使用TempData
将模型数据传递到重定向请求。您可以传递简单的类型,例如字符串,整数,Guid等。如果要通过TempData传递复杂类型的对象,则可以将对象序列化为字符串并将其传递。我已经做了一个简单的测试应用程序,可以满足您的需求:
您的Controller
如下:
public ActionResult TestAction1(ClassA model)
{
model.Id = "1";
model.Name = "test";
model.Marks.Grade = "A";
model.Marks.Marks = 100;
var complexObj = JsonConvert.SerializeObject(model);
TempData["newuser"] = complexObj;
return RedirectToAction("TestAction2");
}
public ActionResult TestAction2()
{
if (TempData["newuser"] is string complexObj )
{
var getModel= JsonConvert.DeserializeObject<ClassA>(complexObj);
}
return View();
}
您的Model
如下所示:
public class ClassA
{
public ClassA()
{
Marks = new StudentMarks();
}
public string Id { get; set; }
public string Name { get; set; }
public StudentMarks Marks { get; set; }
}
public class StudentMarks
{
public int Marks { get; set; }
public string Grade { get; set; }
}
这是一个非常基本的示例,说明了如何使用TempData在重定向操作上在两个控制器之间保留信息。
答案 1 :(得分:0)
ViewData和ViewBag用于相同的目的,以将数据从控制器传输到视图。 通过使用RedirectToAction(“ Index”)您正在创建新的http-Request。 此ViewBag或ViewData可以用于相同的http_Request,即返回View(“ Index”)。
与使用RedirectToAction(“ Index”)一样,您正在创建可以使用TempData的新http请求。 (TempData就像短时间的实时会话一样存储数据。)或Cookie。