从一个视图中获取值到另一个控制器

3
我有一个独特的控制器,在其中我可以控制所有视图,所以我遇到了一个问题。我需要获取发送的值以进行登录验证。例如,我有这个控制器:HomeController,在这个控制器中,我有四个ActionResult

ActionResult Index

ActionResult Login

ActionResult Cuotas

ActionResult LogOff

因此,当用户登录时,我需要在这里获取用户名以验证是否已从我的数据库连接。

HomeController:

public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Login(string uname, string psw)
    {
        try
        {
            ViewData["uname"] = uname;
            ViewData["psw"] = psw;

            ConexionSQL sql = new ConexionSQL();
            var usuario = sql.login(uname, psw);
            var existencia = sql.usuarioOCobrador(uname, psw);

            if (existencia[0].usuario == "USUARIO")
            {
                var caracteres = Convert.ToString(psw);
                var pruebaUsuario = sql.datos(uname);


                if (pruebaUsuario[0].clave == caracteres)
                {
                    return View("Cuotas", usuario);
                }
                else
                {
                    ViewBag.Contra = "Contraseña incorrecta.";
                }
            }
            else if (existencia[0].usuario == "COBRADOR")
            {
                return RedirectToAction("Cuotas", "Home", usuario);
            }
            else
            {
                ViewBag.Usu = "Usuario incorrecto o usted no tiene los permisos para ingresar al sistema. Comuníquese con el área pertinente o el Departamento de Sistemas.";
            }
        }
        catch (SqlException ex)
        {
            throw ex;
        }
        return View("Index");
    }

        public ActionResult LogOff(string uname)
        {
            ConexionSQL conexionSQL = new ConexionSQL();
            conexionSQL.updateConectado(uname, false);
            FormsAuthentication.SignOut();
            Session.Abandon();
            return RedirectToAction("Index", "Home");
        }

        public ActionResult Cuotas()
    {
        ConexionSQL sql = new ConexionSQL();
        string uname = string.Empty;
        string psw = string.Empty;

        //Get your ViewData variables here
        if (ViewData["uname"] != null)
        {
            uname = Convert.ToString(ViewData["uname"]);
        }

        if (ViewData["psw"] != null)
        {
            psw = Convert.ToString(ViewData["psw"]);
        }
        var usuario = sql.datosCob(uname);
        if (usuario[0].conectado == false)
        {
            return RedirectToAction("Index", "Home");
        }
        else
        {
            return RedirectToAction("Cuotas", "Home");
        }
    }
}

首页视图,这里是登录:

        <form class="modal-content animate" onsubmit="return control()" method="post" action="@Url.Action("Login", "Home")">
            <div class="imgcontainer">
                <span onclick="document.getElementById('id01').style.display='none'" class="close" title="Cerrar">&times;</span>
                <img src="~/Images/00.png" alt="Logo" class="avatar"/>
            </div>
            <div class="container">
                <label for="uname"><b>Usuario:</b></label>
                <input type="text" id="uname" placeholder="Ingrese usuario..." name="uname" onkeypress="return soloLetras(event)"/>

                <label for="psw"><b>Contraseña:</b></label>
                <input type="password" id="psw" placeholder="Ingrese contraseña..." name="psw" onkeypress="return soloNumeros(event)"/>

                <button type="submit">Iniciar sesión</button>
            </div>
        </form>

但是uname始终为 null,我的代码哪里出了问题?

输入图像描述

1个回答

2
如果我理解正确,您需要在提交表单时从您首先发布到Login方法的uname中获取此变量,并且您需要在同一请求上使用此变量的Cuotas方法?如果是这种情况,则必须使用Session将变量从一个控制器操作持久化到另一个操作。您的表单操作是Login方法而不是Cuotas方法,因此您的FormCollection将始终为空。所以在您的情况下,它看起来像这样:
    public ActionResult Login(string uname, string psw)
    {
        Response.AppendHeader("Cache-Control", "no-store");
        try
        {
            //Set your variables here to passed to next action
            Session["uname"] = uname;
            Session["psw"] = psw;

            ConexionSQL sql = new ConexionSQL();
            var usuario = sql.login(uname, psw);
            var existencia = sql.usuarioOCobrador(uname, psw);

            if (existencia[0].usuario == "USUARIO")
            {
                var caracteres = Convert.ToString(psw);
                var pruebaUsuario = sql.datos(uname);


                if (pruebaUsuario[0].clave == caracteres)
                {
                    sql.updateConectado(uname, true);
                    return RedirectToAction("Cuotas", "Home");
                }
                else
                {
                    ViewBag.Contra = "Contraseña incorrecta.";
                }
            }
            else if (existencia[0].usuario == "COBRADOR")
            {
                sql.updateConectado(uname, true);
                return RedirectToAction("Cuotas", "Home");
            }
            else
            {
                ViewBag.Usu = "Usuario incorrecto o usted no tiene los permisos para ingresar al sistema. Comuníquese con el área pertinente o el Departamento de Sistemas.";
            }
        }
        catch (SqlException ex)
        {
            throw ex;
        }
        return View("Index");
    }

您可以在Cuotas方法中像这样获取它们:

    public ActionResult Cuotas()
    {
        ConexionSQL sql = new ConexionSQL();
        string uname = string.Empty;
        string psw = string.Empty;
        //Get your ViewData variables here
        if (Session["uname"] != null)
        {
          uname = Convert.ToString(Session["uname"]);
        }

        if (Session["psw"] != null)
        {
          psw = Convert.ToString(Session["psw"]);
        }
        var usuario = sql.datosCob(uname);
        if (usuario[0].conectado == false)
        {
            return RedirectToAction("Index");
        }
        else
        {
            return View("Cuotas");
        }
    }

1
@FrancoJoelBalsamo,您能否解释一下您的事件流是什么?您将表单数据发送到Login方法,然后根据您的逻辑,重定向到Cuotas方法?您可以尝试在重定向之前设置ViewData吗? - Rahul Sharma
1
@FrancoJoelBalsamo 你能否在没有 Model 的情况下进行重定向:return RedirectToAction("Cuotas", "Home"); - Rahul Sharma
不,这表示未找到资源(视图),但是视图确实存在:/ - user14351562
1
@FrancoJoelBalsamo 我已更新我的答案,使用“Session”来解决你的问题。你可以试试吗? - Rahul Sharma
1
是的,使用Session它工作了,感谢您的时间和抱歉。 - user14351562
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接