0

我有以下模型:

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
}
4

2 回答 2

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
于 2012-09-18T05:25:00.123 回答
2

你从错误的角度接近它。由于您没有提供任何编辑 a 的方法,Person因此您应该通过引用传递它(即PersonId)。

因此,只需使用直接链接:

// 看法:

Html.ActionLink( person.Name, "ViewPerson", new { personId = person.ID } );

// 控制器动作:

public ActionResult ViewPerson(String personId) {
    Person person = GetPersonFromDatabase( personId );
}
于 2012-09-18T05:36:28.670 回答