【问题标题】:ASP.NET MVC pass parameter to stored procedure from controller without Entity FrameworkASP.NET MVC 将参数从没有实体框架的控制器传递给存储过程
【发布时间】:2016-05-25 21:44:41
【问题描述】:

来自 Webforms 背景的 ASP.NET MVC 新手。我试图通过HttpContext.User.Identity.Name 将登录的用户名值传递给存储过程。我基本上是在尝试检查 Username 是否存在于数据库表中。我想我忽略了一些事情,因为我不太确定如何将User.Identity.Name 值传递给存储过程,以便它执行并返回一个存在或null/blank 的值。这是我的代码:

数据访问层类:

    public LoggedUser GetLoggedUser(LoggedUser obj)
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["HWebb"].ConnectionString);
        string UserName = "";

        try
        {
            SqlParameter[] parameters ={
                     new SqlParameter("@USER_CRED",obj.User_Name),
                                       };
            SqlCommand cmd = CreateCommand("PortalWeb.GetSelect_User", parameters, con);

            DataTable dt = new DataTable();

            con.Open();
            SqlDataAdapter ada = new SqlDataAdapter(cmd);
            ada.Fill(dt);

            foreach (DataRow dr in dt.Rows)
            {
                if (dr["USER_CRED"] != DBNull.Value)
                    UserName = Convert.ToString(dr["USER_CRED"]);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            con.Close();
        }

        return obj;
    }

型号:

public class LoggedUser
{
    public string User_Name { get; set; }
}

控制器:

public ActionResult UserVerification()
{
        DataAccess dac = new DataAccess();
        LoggedUser objUser = new LoggedUser();
        objUser = dac.GetLoggedUser(objUser);

        if (HttpContext.User.Identity.Name != objUser.User_Name)
        {
            return RedirectToAction("Index", "Home");
        }
        return null;
}

这不会导致任何错误,但我认为参数没有正确传递,因为表返回了 null 值,我不确定 HttpContext.User.Identity.Name 值是否被传递到第一名。

有没有办法将值从控制器传递到存储过程?我对此很陌生,所以我确定我缺少一些代码来使其功能齐全。我希望有人能帮帮忙。

谢谢!

【问题讨论】:

  • 回答您的问题的关键是 CreateCommand 的代码。 Whitout 它谁知道传递给您的 sp 的内容是什么?只有你。
  • 能否请您发布 CreateCommand 的代码
  • 顺便说一句,您的代码逻辑似乎不正确。在控制器中,您创建一个 LoggedUser,但不设置任何属性,然后将此对象传递给 GetLoggedUser。然后使用 user_name 的值来搜索数据库,但在调用 GetLoggedUser 时它有任何值吗?
  • CreateCommand 是一个存储过程,本质上应该只返回一个用户名。也许这应该是 command.ExecuteNonQuery ?另外,您是否建议我将代码更改为 LoggedUser objUser = New LoggedUser(HttpContext.User.Identity.Name)。

标签: c# sql-server asp.net-mvc razor ado.net


【解决方案1】:

我将代码更改为这个,现在它可以工作了,尽管我确信有更好的方法。

  public string GetLoggedUser(string User_Name)
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["HWebb"].ConnectionString);
    string UserName = "";

    try
    {
        SqlParameter[] parameters ={
                 new SqlParameter("@USER_CRED", User_Name),
                                   };
        SqlCommand cmd = CreateCommand("PortalWeb.GetSelect_User", parameters, con);

        DataTable dt = new DataTable();

        con.Open();
        SqlDataAdapter ada = new SqlDataAdapter(cmd);
        ada.Fill(dt);

        foreach (DataRow dr in dt.Rows)
        {
            if (dr["USER_CRED"] != DBNull.Value)
                UserName = Convert.ToString(dr["USER_CRED"]);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        con.Close();
    }

    return UserName;
}

然后在Controller中:

   public ActionResult UserVerification()
    {

        DataAccess dac = new DataAccess();
        string UserNameApp = HttpContext.User.Identity.Name;
        string UserName = dac.GetLoggedUser(UserNameApp);

if (HttpContext.User.Identity.Name != UserName) { return redirecToAction("Index", "Home"); }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多