我有以下模型:
public class Person
{
public int ID{get;set;}
public string Name {get;set;}
public string Address{get;set;}
}
另一方面,我有以下称为索引的视图:
@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
}
开机自检解决方案:
为了使用它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
你从错误的角度接近它。由于您没有提供任何编辑Person
的方法,因此您应该通过引用(即PersonId
)传递它。
因此,只需使用直接的链接:
//视图:
Html.ActionLink( person.Name, "ViewPerson", new { personId = person.ID } );
控制器操作:
public ActionResult ViewPerson(String personId) {
Person person = GetPersonFromDatabase( personId );
}