C# 获取所选数据
我已经有了从数据库检索数据的SQL语句,但是我不知道如何将我创建的类中的值传递给控制器,最后传递给视图本身。我试着从我在控制器中创建的类中调用从数据库检索数据的方法,并使用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() {
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 »" />
<input type="button" value="Cancel »" />
</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 »" />
<input type="button" value="Cancel »" />
</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
(typeofstring
的默认值)。然后调用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()
),因此不会返回任何内容。你们到底想做什么?你们传递的是空模型,我想你们可以试着分配一些东西,然后传递给视图。不需要取景袋。cheersManageUser 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可以在存储值的同时将操作链接到按钮
。