C# 在MVC4中传递对象
目前我在学习MVC4方面有点困难,我希望有人能帮我。据我所知,在搜索中没有重复出现这个问题,但如果有,请告诉我 我的问题是:在我的index.aspx页面上显示的学校列表中,是否有可能让用户单击“详细信息”链接,以便它返回并显示该特定学校的详细信息?我已经包含了下面代码中的所有相关信息,但是如果太多,请原谅(我不确定到底需要什么) 如您所见,ActionResult Index()返回数据库中所有学校的列表。我想做的是在他们点击“详细信息”时发回,这样视图就会返回该学校的具体信息。这可能吗?我想可能只是传递被点击的学校的Id,但是当我回到DAC层时,它接受一个Id(int)作为参数,当我希望它返回一个类型为“school”的对象时。这有意义吗 值得一提的是,我知道一点Javascript,但还不知道jQuery、JSON等 所以我有5层:C# 在MVC4中传递对象,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,目前我在学习MVC4方面有点困难,我希望有人能帮我。据我所知,在搜索中没有重复出现这个问题,但如果有,请告诉我 我的问题是:在我的index.aspx页面上显示的学校列表中,是否有可能让用户单击“详细信息”链接,以便它返回并显示该特定学校的详细信息?我已经包含了下面代码中的所有相关信息,但是如果太多,请原谅(我不确定到底需要什么) 如您所见,ActionResult Index()返回数据库中所有学校的列表。我想做的是在他们点击“详细信息”时发回,这样视图就会返回该学校的具体信息。这可能吗?我想
SchoolVO.cs:
public int Id { get; set; }
public string Name { get; set; }
public string Slogan { get; set; }
我的数据库访问类:
SchoolDAC.cs
public static School GetSchool(School school)
{
try
{
using (SqlConnection conn = ConnectionHelper.GetConnection("SchoolDB"))
{
SqlCommand cmd = new SqlCommand("Schools.GetSchool", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@SchoolId", school.Id);
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.Read())
{
school = readRecord(dr);
// readRecord() is just another method that fills the 3 properties of the school object with data from the database.
}
}
return school;
}
}
catch (Exception ex)
{
throw new Exception("Failed to get school", ex);
}
}
我的“业务”层:
我的控制器:
SchoolController.cs:
public ActionResult Index()
{
List<School> model = SchoolBus.GetAllSchools();
return View(model);
}
[HttpPost]
public ActionResult Index(School school)
{
School model = SchoolBus.GetSchool(school);
return View(model);
}
SchoolController.cs:
公共行动结果索引()
{
列表模型=SchoolBus.GetAllSchools();
返回视图(模型);
}
[HttpPost]
公共行动成果指数(学校)
{
学校模型=校车。GetSchool(学校);
返回视图(模型);
}
我的看法是:
index.aspx:
<table>
<tr>
<th>
<%: Html.DisplayNameFor(model => model.Id) %>
</th>
<th>
<%: Html.DisplayNameFor(model => model.Name) %>
</th>
<th>
<%: Html.DisplayNameFor(model => model.Slogan) %>
</th>
<th></th>
</tr>
<% foreach (var item in Model) { %>
<tr>
<td>
<%: Html.DisplayFor(modelItem => item.Id) %>
</td>
<td>
<%: Html.DisplayFor(modelItem => item.Name) %>
</td>
<td>
<%: Html.DisplayFor(modelItem => item.Slogan) %>
</td>
<td> <!--- possible to pass an object through here? --->
<%: Html.ActionLink("Sign Up", "Index", new { id=item.Id }) %> |
<%: Html.ActionLink("Details", "Details", new { id=item.Id }) %> |
<%: Html.ActionLink("Delete", "Delete", new { id=item.Id }) %>
</td>
</tr>
<% } %>
</table>
index.aspx:
型号(Id)%>
型号(名称)%%>
型号(标语)%>
项目Id)%>
项目名称)%>
项目.口号)%>
|
|
您不应该将整个学校对象传递给控制器。我将向您展示我在项目中使用的类似方法:
[HttpGet]
public ActionResult Edit(int id)
{
DbUser editedDbUser = context.Users.Single(x => x.UserId == id);
User editeduser = Mapper.Map<DbUser, User>(editedDbUser);
return View("AccountInfo", editeduser);
}
[HttpGet]
公共操作结果编辑(int id)
{
DbUser editedDbUser=context.Users.Single(x=>x.UserId==id);
用户editeduser=Mapper.Map(editedBuser);
返回视图(“AccountInfo”,编辑用户);
}
在我看来,我知道这是剃刀,但想法是一样的:
<tr>
<td>@(i + 1)</td>
<td>@usersModel[i].LastName</td>
<td>@usersModel[i].FirstName</td>
<td>@usersModel[i].Email</td>
<td>@Html.ActionLink("Edit", "Edit", new { id = @usersModel[i].UserId })</td>
</tr>
@(i+1)
@usersModel[i]。姓氏
@usersModel[i].FirstName
@usersModel[i]。电子邮件
@ActionLink(“编辑”,“编辑”,新{id=@usersModel[i].UserId})
为了回答您的问题,这是我的模型-它只是我在传递到视图之前填充的列表
public class Users
{
public List<User> UsersBag { get; set; }
}
公共类用户
{
公共列表UsersBag{get;set;}
}
如果您的模型中没有Id,则必须具有另一个属性,您可以通过该属性区分列表中的对象,但我建议保留某种Id。您不应该将整个学校对象传递给控制器。我将向您展示我在项目中使用的类似方法:
[HttpGet]
public ActionResult Edit(int id)
{
DbUser editedDbUser = context.Users.Single(x => x.UserId == id);
User editeduser = Mapper.Map<DbUser, User>(editedDbUser);
return View("AccountInfo", editeduser);
}
[HttpGet]
公共操作结果编辑(int id)
{
DbUser editedDbUser=context.Users.Single(x=>x.UserId==id);
用户editeduser=Mapper.Map(editedBuser);
返回视图(“AccountInfo”,编辑用户);
}
在我看来,我知道这是剃刀,但想法是一样的:
<tr>
<td>@(i + 1)</td>
<td>@usersModel[i].LastName</td>
<td>@usersModel[i].FirstName</td>
<td>@usersModel[i].Email</td>
<td>@Html.ActionLink("Edit", "Edit", new { id = @usersModel[i].UserId })</td>
</tr>
@(i+1)
@usersModel[i]。姓氏
@usersModel[i].FirstName
@usersModel[i]。电子邮件
@ActionLink(“编辑”,“编辑”,新{id=@usersModel[i].UserId})
为了回答您的问题,这是我的模型-它只是我在传递到视图之前填充的列表
public class Users
{
public List<User> UsersBag { get; set; }
}
公共类用户
{
公共列表UsersBag{get;set;}
}
如果模型中没有Id,则必须具有另一个属性,通过该属性可以区分列表中的对象,但我建议保留某种Id。尝试这样做
查看
我的行动链接
@Html.ActionLink("EditUser", "DYmanicControllerPage", "Test", new { Id = m.ID }, new { @class = "hide" })
我的控制器
[HttpGet]
public ActionResult DYmanicControllerPage(string Id)
{
var model = new RegisterModel();
int _ID = 0;
int.TryParse(Id, out _ID);
if (_ID > 0)
{
RegisterModel register = GetRegisterUserById(_ID);
model.ID = _ID;
model.Name = register.Name;
model.Address = register.Address;
model.PhoneNo = register.PhoneNo;
}
return View(model);
}
我的“业务”层:
public RegisterModel GetRegisterUserById(int Id)
{
RegisterModel model = new RegisterModel();
using (dataDataContext _context = new dataDataContext())
{
return model = (from r in _context.Registrations
where r.RID == Id
select new RegisterModel
{
ID = Id,
Name = r.REName,
Address = r.REAddress,
PhoneNo = r.REPhoneNo
}).FirstOrDefault();
}
}
试着这样,
查看
我的行动链接
@Html.ActionLink("EditUser", "DYmanicControllerPage", "Test", new { Id = m.ID }, new { @class = "hide" })
我的控制器
[HttpGet]
public ActionResult DYmanicControllerPage(string Id)
{
var model = new RegisterModel();
int _ID = 0;
int.TryParse(Id, out _ID);
if (_ID > 0)
{
RegisterModel register = GetRegisterUserById(_ID);
model.ID = _ID;
model.Name = register.Name;
model.Address = register.Address;
model.PhoneNo = register.PhoneNo;
}
return View(model);
}
我的“业务”层:
public RegisterModel GetRegisterUserById(int Id)
{
RegisterModel model = new RegisterModel();
using (dataDataContext _context = new dataDataContext())
{
return model = (from r in _context.Registrations
where r.RID == Id
select new RegisterModel
{
ID = Id,
Name = r.REName,
Address = r.REAddress,
PhoneNo = r.REPhoneNo
}).FirstOrDefault();
}
}
迈克尔,我想我明白了。您正在使用[HttpGet]并让ActionResult获取一个Id,返回到同一个视图,但让您的标记(在本例中是Razor)获取@usersModel中的特定条目[i]?但有一个问题是,如果没有Id,标记中会发生什么?usersModel是否只是一个循环的列表(如果您的表行在循环中,则在上面的片段中)?@SalarianEngineer您得到的是正确的。要回答您的问题,请参阅我更新的postMichael,我想我理解。您使用[HttpGet]并让ActionResult获取Id,返回到同一视图,但让标记(Razor,在本例中)在@usersModel中获取特定的条目[i]?但有一个问题是,如果没有Id,标记中会发生什么?usersModel是否只是一个循环的列表(如果您的表行在循环中,则在上面的片段中)?@SalarianEngineer您得到的是正确的。要回答您的问题,请参阅我更新的postJaimin,这样您就可以通过Html传递Id