我有以下型号:
public class Person
{
public int ID{get;set;}
public string Name {get;set;}
public string Address{get;set;}
}
另一方面,我有以下名为Index:
的观点@model List<Person>
@{
foreach(Person person in Model)
{
<a href="#" id="@person.ID">@person.Name</a>
}
}
最后我有以下行动:
public ActionResult Index()
{
List<Person> persons=new List<Person>();
persons.Add(new Person(){ID=1,Name="John"});
persons.Add(new Person(){ID=2,Name="Tom"});
persons.Add(new Person(){ID=2,Name="Derek"});
}
我正在考虑创建一个表单(由于某些要求我不能使用ajax这个应用程序),发布用户选择的人的实例(当点击我的视图的锚点时)。我想知道如何将Person实例发布到下面描述的另一个操作(因为我的视图被输入到一个通用的人员列表中)。
[HttpPost]
public ActionResult Index(Person person)
{
... Do whatever
}
答案 0 :(得分:2)
POST解决方案:
为了与POST
一起工作,你必须找到一个表格并植入隐藏的字段,如
@model List<Person>
@{
foreach(Person person in Model)
{
<form action="/controller/actionresult">
<input type="submit" value=person.Name />
<input type="hidden" name="ID" value="@person.ID"
<input type="hidden" name="Name" value="@person.Name"
</form>
}
}
并在服务器端
[HttpPost]
public ActionResult Index(Person person)
{
... Do whatever
}
GET
的解决方案:
a
标签通常不适用于POST,默认行为是通过GET
向服务器请求资源,尽管您可以使用javascript覆盖此行为,但在您的情况下,这不是一个选项,因此您可以尝试
@model List<Person>
@{
foreach(Person person in Model)
{
@Html.ActionLink(persno.Name,"Index","home",new{ID=person.ID,Name=person.Name,null);
}
}
唯一的缺点是您必须使用提交按钮而不是a
标记,您可以使用CSS样式来设置按钮的样式,如a
标记。此外,如果您没有为此类请求设置自定义路由,则uri将具有查询字符串参数,如
http://yourdomain/home/index?ID=1&Name=john
答案 1 :(得分:2)
你从错误的角度接近它。由于您没有提供任何编辑Person
的方法,因此您应该通过引用(即PersonId
)传递它。
所以只需使用直接链接:
//查看:
Html.ActionLink( person.Name, "ViewPerson", new { personId = person.ID } );
//控制器操作:
public ActionResult ViewPerson(String personId) {
Person person = GetPersonFromDatabase( personId );
}