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



我有以下模型:

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

最新更新