2010-09-25 32 views
1

今天我有一些有趣的观察,我需要解释。我有一个被描述为我上面的Person类:MVC如何填充Id参数?

public class Person 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

现在在我的MVC2应用我有PersonController具有以下编辑梅托德:

public ActionResult Edit(int id) 
{ 
    var permission = _service.GetPerson(id); 
    return View(person); 
} 

[HttpPost] 
public ActionResult Edit(Person person) 
{ 
    if (ModelState.IsValid) 
    { 
     _service.UpdatePerson(permission); 
     return RedirectToAction("Index"); 
    } 

    return View(person); 
} 

现在我Edit.aspx观点我有形式只包含名字和姓氏,但是当我的控制器中的帖子完成时,令我感到惊讶的是,Person对象的Id设置正确(它不是表单的一部分)。

现在我猜它是从id参数的路由值中获取的,这是发送到我的操作地址中的,但它是否保存?我的意思是,我不需要为id设置隐藏字段,但是在mvc2中混合get和post参数会导致任何危险吗?

还有一个问题。如果我确实隐藏了id,该怎么办?然后它会被发送(get和post),所以然后..将使用哪个id?

回答

2

是的,它是取自路线。这很危险,因为如果您在Person类上重命名此属性,您的代码可能会中断。此外,如果您更改路线,可能会发生同样的情况。

并回答你的第二个问题。假设以下形式:

<form action="/home/edit/5" method="post"> 
    <input type="text" name="Id" value="1" /> 
    <input type="submit" value="Go" /> 
</form> 

在这种情况下,Id将取自POST请求而不是路由。

+0

好吧..那么我在我的问题的底部描述(编辑后)的情况是什么? – 2010-09-25 10:12:30

+0

@Darin是真的吗?那么,第一个是来自课程路线,但第二个应该来自隐藏领域,因为他使用的视图是Person的强类型(我猜是这样)。发布到编辑时,路由中没有Id,只有在发布后的值 – 2010-09-25 10:14:13

+0

否,不会从路由中获取。 Person对象在第一个Controller中生成,然后显示。同一个Person对象被发送到第二个控制器并在数据库中更新。在GET中重命名参数只会在第一个方法中产生效果。 – Femaref 2010-09-25 10:14:16

1

当mvc默认模型绑定器绑定对象时,它会在很多地方查找它的值,并且匹配的路由就是其中一个地方。如果你改变你的属性名称从id到personID它不会从路由值填充,你必须把隐藏的字段在你的形式来获得它。为了避免这种混淆,我总是命名与路线参数不同的属性。