Viewbag是否可以在保持其价值的同时处理重定向?

时间:2019-08-20 11:31:09

标签: c# html model-view-controller view

我只是想知道如何为索引页上的某些条件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或查询

2 个答案:

答案 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。