Действие не получено от другого контроллера - PullRequest
0 голосов
/ 05 декабря 2018

Я прошу простую страницу входа, чтобы пользователь мог ввести пин-код в мобильном адаптивном приложении, находящемся дома, но не в сети.

Когда страница размещена, пользователь нажимает кнопку отправки, когда 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();
}

Но метод не получает удар, если я не выполню сложныйперезагрузить, есть ли другой способ перейти к другому представлению и убедиться, что используется метод index?.

Потому что, когда я смотрю на пакет, элементы становятся нулевыми, когда они должны содержать имя пользователя и парольсоответствующая строка, когда я отлаживаю на первой странице значения их, но затем теряются на другой странице.

На моей странице я хочудля отображения информации, которую я просто делаю

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

Но значение пустое?Я работаю на веб-формах, поэтому прошу прощения, что лучше поздно, чем никогда не прыгать с корабля

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Ваша последовательность событий ...

  • Пользователь отправляет POST SaveUsers на Login (псевдоним действия Index)
  • Вы возвращаете представление
  • Пользовательские сообщения из этого представления в Index, все еще включены Login

Когда вы делаете это:

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

Выпо сути переопределяет стандартное поведение фреймворка.Вы возвращаете определенный файл, который будет использоваться в качестве представления, но не говорите платформе о необходимости переключения контекста или изменения URL-адреса.Таким образом, с точки зрения браузера *1023*, даже если вы вернули представление из папки Home на стороне сервера, страница по-прежнему /Login/Index, и любые действия с формами, ссылки и т. Д. Будут оттуда.

Как правило, вы предпочитаете перенаправления указывать представления вручную.Таким образом, разумная последовательность событий может быть такой:

  • POST пользователя к SaveUsers на Login (псевдонимом действия Index)
  • Серверный код выполняет свою логику, перенаправляет пользователя на Index в Home
  • пользовательских GET Index в Home
  • Сервер возвращает представление
  • пользовательских POST в Index вHome

Таким образом, ваш метод действия SaveUsers, в случае успеха, может сделать что-то вроде:

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

Это тогда заставит пользователя сделать запрос GET к Index на Home, который может просто return View(), и по умолчанию будет отображаться в виде, который вы сейчас возвращаете вручнуюТеперь, с точки зрения браузера, он находится на /Home/Index, и все действия формы, ссылки и т. Д. Будут происходить из этого контекста.

Кроме того, если вы всегда хотите, чтобы данная форма, ссылка и т. Д. Указывали на конкретнуюдействие контроллера независимо от того, откуда оно было загружено, вы можете указать это.Например, когда вы делаете это:

using (Html.BeginForm())

Вы сообщаете платформе, что эта форма будет "POST к текущему URL, каким бы ни был этот URL".Но когда вы делаете это:

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

Это говорит платформе, что форма будет всегда отправлять действие Index на контроллере Home, независимо от текущего URL.

0 голосов
/ 05 декабря 2018

Можете ли вы попробовать использовать

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

}

И использовать RedirectToAction, чтобы вернуться в свой домашний индекс ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...