动作未被其他控制器击中

时间:2018-12-05 12:53:14

标签: c# asp.net-mvc

我要一个简单的登录页面,让用户在其内部不在线的移动响应应用程序上输入图钉。

页面发布后,用户单击“提交”按钮,SaveUsers是首先在登录控制器上调用的函数。

[HttpPost]
[ActionName("Index")]
public ActionResult SaveUsers(Users model)
{
        BrianScott_SOMEntities usr = new BrianScott_SOMEntities();
        var s = usr.GetUsers(model.Pin);

        var item = s.FirstOrDefault();
        if (item == "Success")
        {
            var sageDetails = usr.Users.Where(w => w.Pin ==model.Pin).FirstOrDefault();

            HttpCookie cookie = new HttpCookie("BScotSalesOrderManagerLogin");
            cookie.Values.Add("SageUserName", sageDetails.SageUserName.ToString());
            cookie.Values.Add("SagePassword", sageDetails.SagePassWord.ToString());
            cookie.Expires = DateTime.Now.AddDays(30);
            Response.Cookies.Add(cookie);

            return View("~/Views/Home/Index.cshtml");

    }
    else if (item == "User Does not Exists")

    {
       ViewBag.NotValidUser = item;

    }
    else
    {
       ViewBag.Failedcount = item;
     }
   return View("Index.cshtml");
}

下面的表单是上面的控制器表示的表单,它提示用户输入其密码。

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}


@model Web.SOM.Models.Users


@using (Html.BeginForm())
{
<div class="bs-example" style="border:2px solid gray;">
    <label>@ViewBag.SageUserName</label>
    <div class="form-group centerlook">
        <h1> Login </h1>
    </div>
    <div class="form-group centerlook">
        <label>Pin: </label>
        @Html.EditorFor(model => model.Pin  )*
        @Html.ValidationMessageFor(model => model.Pin)
    </div>
            <div class="form-group error">
        @if (@ViewBag.Failedcount != null)
        {

            <label> Failed Attempt count is: @ViewBag.Failedcount</label>
        }

        @if (@ViewBag.NotValidUser != null)
        {

            <label> @ViewBag.NotValidUser</label>
        }
    </div>
    <div class="loginbtn">

        <input type="submit" value="Login" class="btn btn-primary" />

    </div>
</div>
}

home控制器是第一段代码中的控制器重定向到的位置,它是我要命中的索引动作。

public ActionResult Index()
{
 if (Request.Cookies["BScotSalesOrderManagerLogin"] != null)
 {
            ViewBag.SageUserName = Request.Cookies["BScotSalesOrderManagerLogin"].Values["SageUserName"];
            ViewBag.SagePassword = Request.Cookies["BScotSalesOrderManagerLogin"].Values["SagePassword"];
  }
 return View();
}

但是该方法不会被命中,除非我进行硬重装,否则还有另一种方法可以移动到另一个视图并确保索引方法正在被命中?。

因为当我查看视图包时,当它们在第一页上调试时值应为用户名和相关行的密码时,则它们为空,而在其他页面上则丢失了这些值。

在我的页面上,我想显示我正在做的信息

<label>Sage Username : @ViewBag.SageUserName </label>

但是值是空的吗?我来自网络表单背景,所以请您比不要跳船迟到更好。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用

@using (Html.BeginForm(yourActionName, yourControllerName))
{

}

然后使用RedirectToAction返回您的家庭索引。

答案 1 :(得分:2)

您的活动顺序是...

  • 用户POST到SaveUsers上的Login(别名为操作Index
  • 您返回视图
  • 从该视图
  • 用户POST到Index仍在Login

执行此操作时:

return View("~/Views/Home/Index.cshtml");

您实质上是覆盖框架的标准行为。您将返回一个特定的文件用作视图,但没有告诉框架以任何方式切换任何上下文或更改URL。因此,从浏览器角度来看,即使您从服务器端Home文件夹返回一个视图,该页面仍为/Login/Index,并且任何表单操作,链接等都将从那里来。

通常,您应该更喜欢重定向而不是手动指定视图。因此,明智的事件序列可能是:

  • 用户POST到SaveUsers上的Login(别名为操作Index
  • 服务器端代码执行其逻辑,将用户重定向到Index上的Home
  • Index上的用户GET Home
  • 服务器返回视图
  • 用户POST到Index上的Home

因此,您的SaveUsers操作方法成功后可以执行以下操作:

return RedirectToAction("Index", "Home");

然后,这将导致用户向Index上的Home发出GET请求,该请求只能是return View(),并且默认为您现在手动返回的视图。现在,从浏览器的角度来看,它位于/Home/Index上,所有表单操作,链接等都将来自该上下文。

此外,如果始终希望给定的表单,链接等指向特定的控制器动作,而不管它从何处加载,则可以指定它。例如,当您这样做时:

using (Html.BeginForm())

您正在告诉框架此表单将“张贴到当前URL,无论该URL是什么”。但是,当您这样做时:

using (Html.BeginForm("Index", "Home"))

这告诉框架,无论当前URL是什么,该表单将始终发布到Index控制器上的Home操作上。