C# 获取所选数据

C# 获取所选数据,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我已经有了从数据库检索数据的SQL语句,但是我不知道如何将我创建的类中的值传递给控制器,最后传递给视图本身。我试着从我在控制器中创建的类中调用从数据库检索数据的方法,并使用ViewBag-->ViewBag.Name保存值,然后像这样将其传递给视图:@ViewBag.Name。当我运行时,没有显示任何内容,比如没有调用检索数据的方法 我的问题是,如何从数据库传递值并将其放入视图中 以下是我正在使用的代码: 控制器: [HttpGet] public ActionResult Update() {

我已经有了从数据库检索数据的SQL语句,但是我不知道如何将我创建的类中的值传递给控制器,最后传递给视图本身。我试着从我在控制器中创建的类中调用从数据库检索数据的方法,并使用
ViewBag
-->
ViewBag.Name
保存值,然后像这样将其传递给视图:
@ViewBag.Name
。当我运行时,没有显示任何内容,比如没有调用检索数据的方法

我的问题是,如何从数据库传递值并将其放入视图中

以下是我正在使用的代码:

控制器

[HttpGet]
public ActionResult Update()
{
    ManageUser user = new ManageUser();

    user.GetData(user.Username);

    ViewBag.Username = user.Username;

    ViewBag.EmployeeID = user.EmployeeID;

    return View(user);
}

[HttpPost]
public ActionResult Update(ManageUser user)
{
    if (ModelState.IsValid)
    {
        if (user.UpdateData())
        {
            return RedirectToAction("List", "Home");
        }

        else
        {
            ModelState.AddModelError(string.Empty, "Cannot update to the database!");
        }
    }

    return View(user);
}
@model ProjectName.Models.ManageUser
@{
    ViewBag.Title = "Update";
}

<h2>Update</h2>
<br />

@using (Html.BeginForm())
{
    @Html.ValidationSummary();

    <div>
        <fieldset>
            <legend>Credentials Register</legend>
            <div class="editor-label">
                @Html.LabelFor(u => u.Username)
            </div>
            <div class="editor-field">
                @ViewBag.Username
                @Html.DisplayFor(u => u.Username)
            </div>
            <div class="editor-label">
                @Html.LabelFor(u => u.EmployeeID)
            </div>
            <div class="editor-field">
                @ViewBag.EmployeeID
                @Html.DisplayFor(u => u.EmployeeID)
            </div>
            <input type="submit" value="Update &raquo;" />
            <input type="button" value="Cancel &raquo;" />
        </fieldset>
    </div>
}
[Required(ErrorMessage = "Please fill-in Username.")]
[Display(Name = "Username:")]
public string Username
{
    get;
    set;
}

[Required(ErrorMessage = "Please fill-in Employee ID.")]
[Display(Name = "Employee ID:")]
public string EmployeeID
{
    get;
    set;
}
public void GetData(string username)
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        string query = "SELECT [Username], [EmployeeID] FROM [User] WHERE [Username] = @Username";

        conn.Open();

        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            cmd.Parameters.Add("@Username", SqlDbType.NVarChar);

            if (string.IsNullOrEmpty(Username))
            {
                cmd.Parameters["@Username"].Value = DBNull.Value;
            }

            else
            {
                cmd.Parameters["@Username"].Value = username;
            }

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        Username = reader["Username"].ToString();

                        EmployeeID = reader["EmployeeID"].ToString();
                    }
                }

                else
                {
                    reader.Dispose();

                    cmd.Dispose();
                }
            }
        }
    }
}
查看

[HttpGet]
public ActionResult Update()
{
    ManageUser user = new ManageUser();

    user.GetData(user.Username);

    ViewBag.Username = user.Username;

    ViewBag.EmployeeID = user.EmployeeID;

    return View(user);
}

[HttpPost]
public ActionResult Update(ManageUser user)
{
    if (ModelState.IsValid)
    {
        if (user.UpdateData())
        {
            return RedirectToAction("List", "Home");
        }

        else
        {
            ModelState.AddModelError(string.Empty, "Cannot update to the database!");
        }
    }

    return View(user);
}
@model ProjectName.Models.ManageUser
@{
    ViewBag.Title = "Update";
}

<h2>Update</h2>
<br />

@using (Html.BeginForm())
{
    @Html.ValidationSummary();

    <div>
        <fieldset>
            <legend>Credentials Register</legend>
            <div class="editor-label">
                @Html.LabelFor(u => u.Username)
            </div>
            <div class="editor-field">
                @ViewBag.Username
                @Html.DisplayFor(u => u.Username)
            </div>
            <div class="editor-label">
                @Html.LabelFor(u => u.EmployeeID)
            </div>
            <div class="editor-field">
                @ViewBag.EmployeeID
                @Html.DisplayFor(u => u.EmployeeID)
            </div>
            <input type="submit" value="Update &raquo;" />
            <input type="button" value="Cancel &raquo;" />
        </fieldset>
    </div>
}
[Required(ErrorMessage = "Please fill-in Username.")]
[Display(Name = "Username:")]
public string Username
{
    get;
    set;
}

[Required(ErrorMessage = "Please fill-in Employee ID.")]
[Display(Name = "Employee ID:")]
public string EmployeeID
{
    get;
    set;
}
public void GetData(string username)
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        string query = "SELECT [Username], [EmployeeID] FROM [User] WHERE [Username] = @Username";

        conn.Open();

        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            cmd.Parameters.Add("@Username", SqlDbType.NVarChar);

            if (string.IsNullOrEmpty(Username))
            {
                cmd.Parameters["@Username"].Value = DBNull.Value;
            }

            else
            {
                cmd.Parameters["@Username"].Value = username;
            }

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        Username = reader["Username"].ToString();

                        EmployeeID = reader["EmployeeID"].ToString();
                    }
                }

                else
                {
                    reader.Dispose();

                    cmd.Dispose();
                }
            }
        }
    }
}
请参考他的

您的数据访问方法将是

public ManageUser GetData(string username)
{
    var result=new ManageUser();
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
           string query = "SELECT [Username], [EmployeeID] FROM [User] WHERE [Username] = @Username";
           conn.Open();    
           using (SqlCommand cmd = new SqlCommand(query, conn))
           {
                cmd.Parameters.Add("@Username", SqlDbType.NVarChar);    
                if (string.IsNullOrEmpty(Username))
                {
                     cmd.Parameters["@Username"].Value = DBNull.Value;
                }   
                else
                {
                     cmd.Parameters["@Username"].Value = username;
                }   
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                         while (reader.Read())
                         {                                  
                                result.Username = reader["Username"].ToString();    
                                result.EmployeeID = reader["EmployeeID"].ToString();
                          }
                     }    
                     else
                     {
                          reader.Dispose();    
                          cmd.Dispose();
                      }
                 }
           }
           return result;
  }


        }
你的行动将是

[HttpGet]
public ActionResult Update(string username)
{
     ManageUser user = new ManageUser();    
     user =GetData(username);//call data access            
     return View(user);
}
上述数据访问方法应该从模型移动到其他地方(可以是控制器作为私有方法)

观点保持原样


希望你收到了

首先要说明为什么没有加载数据。在
Update()
方法中,首先初始化ManageUser的新实例,其
Username
的默认值将为
null
(typeof
string
的默认值)。然后调用
user.GetData(user.Username)
null
传递给方法并基于

if (string.IsNullOrEmpty(Username)) // it is!
{
  cmd.Parameters["@Username"].Value = DBNull.Value;
}
然后,您的查询返回其
用户名
字段为
的所有用户。如果数据库不包含
Username为NULL的任何行,则不会返回任何行,因此不会显示任何数据

但是,在模型中包含此方法是一种糟糕的做法(其他方法(如获取所有用户)又如何呢。首先将以下两个类添加到
数据
文件夹中

public interface IUserDB
{
  List<User> Fetch();
  User Get(int ID);
}
public class UserDB : IUserDB
{
  public List<User> Fetch()
  {
    List<User> users = new List<User>();
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
      string query = "SELECT [Username], [EmployeeID] FROM [User];
      conn.Open();
      using (SqlCommand cmd = new SqlCommand(query, conn))
      {
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
          while (reader.Read())
          {
            User user = new User();
            user.Username = reader["Username"].ToString();
            user.ID = reader["EmployeeID"].ToString();
            users.Add(user);
          }
        }
      }
    }
    return users;
  }
  public User Get(int ID)
  {
    User user = new User();
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
      string query = "SELECT [Username], [EmployeeID] FROM [User] WHERE [EmployeeID] = @ID";
      conn.Open();
      using (SqlCommand cmd = new SqlCommand(query, conn))
      {
        cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = ID;
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
          if (!reader.Read())
          {
            return null;
          }
          user.ID = reader["EmployeeID"].ToString();
          user.UserName = reader["Username"].ToString();  
        }
      }
    }
    return user;
  }
}
注意:类名应该反映它是什么,而不是它是什么-它不应该包含诸如“Manage”之类的动词

现在在控制器中,您可以调用这些方法来构造视图

public Controller UserController : Controller
{
  UserDB _Repository = new UserDB(); // later you will use DI
  public ActionResult Index()
  {
    List<User> model = _Repository.Fetch();
    return View(model);
  }
  public ActionResult Edit(int ID)
  {
    User model = _Repository.Get(ID);
    if (model == null)
    {
      return new HttpNotFoundResult();
    }
    return View(model);
  }
}
单击链接将用户
ID
值传递给
Edit(int-ID)
方法,该方法将返回具有该ID值的
User


请注意,您的
Edit.cshtml
视图需要包含编辑控件,即
@Html.TextBoxFor(m=>m.UserName)
,而不是
@Html.DisplayFor(m=>m.UserName)

为什么要包含
ViewBag.UserName=user.UserName
ViewBag.EmployeeID=user.EmployeeID?-您已经将模型传递给视图,并且在任何情况下都无法访问视图中的
ViewBag
属性。您为什么要查看表单?您甚至不创建任何控件(例如
@Html.TextBoxFor()
),因此不会返回任何内容。你们到底想做什么?你们传递的是空模型,我想你们可以试着分配一些东西,然后传递给视图。不需要取景袋。cheers
ManageUser user=newmanageuser()
后跟
user.GetData(user.Username)
表示将
null
传递给
GetData()
方法,这意味着您的查询结果为
“从[User]中选择[Username],[EmployeeID],其中[Username]为null”
我怀疑它不会返回任何内容,因此不会填充任何属性。@StephenMuecke:当用户单击表单中的“编辑”按钮。如果在ASP.Net Webforms中,我可以这样做,但在MVC中我感到困惑。因此类似于[Link](),但不使用EF,我仅尝试使用SQL查询语法获取所选数据编辑按钮(您没有在表单中显示任何编辑按钮)。非常感谢,先生,它可以工作!但是,我有一个问题。。我想使用按钮而不是
TextLink(@Html.ActionLink)
,但是我怎么能更改它呢?我不知道。再次非常感谢!如果要使用按钮,您需要使用javascript/jquery来处理它的
。单击()
事件并执行重定向,但您可以使用css将
标记样式设置为按钮(这是正确的方法)对不起,我不知道怎么做,也完全不知道@Stephen Muecke。网上有很多这样做的例子-。只需检查你想要模仿的现有按钮的css,然后给
标签一个类名,并设置该类名的css属性以匹配你的按钮谢谢@Stephen Muecke,我是lready可以在存储值的同时将
操作链接到
按钮