在MVC3中发布接收模型的表单

时间:2012-09-18 05:21:08

标签: asp.net-mvc asp.net-mvc-3

我有以下型号:

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
}

2 个答案:

答案 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 );
}