【问题标题】:How MVC fill Id parameter?MVC如何填充Id参数?
【发布时间】:2010-09-25 10:06:20
【问题描述】:

今天我有一些有趣的观察,我需要解释一下。我的Person 类如上所述:

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 参数的 rout 值中获取的,即发送到我的操作地址中,但它保存了吗?我的意思是.. id不用加隐藏字段就好了,但是在mvc2中混用get和post参数有什么危险吗?

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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-2 action


    【解决方案1】:

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

    然后回答你的第二个问题。假设如下形式:

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

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

    【讨论】:

    • 好的.. 那么我在问题底部描述(编辑后)的情况是什么?
    • @Darin 真的是这样吗?好吧,第一个来自当然路线,但第二个应该来自隐藏字段,因为他正在使用的视图是针对 Person 的强类型(我猜是这样)。发布到编辑时,路线中没有 Id,仅在帖子值中
    • 不,它不是取自路线。 Person 对象在第一个控制器中生成,然后显示。相同的 Person 对象被发送到第二个控制器并在数据库中更新。在 GET 中重命名参数只会对第一种方法产生影响。
    • @Oskar,@Femaref,OP 明确表示表单中没有 ID 参数,只有名字和姓氏。你没有仔细阅读问题吗?然后他问这个 id 属性是如何填充的,假设表单中没有相应的字段,当然它来自路由。
    • @Darin 但 MVC 为他生成了一个隐藏字段
    【解决方案2】:

    当 mvc 默认模型绑定器绑定对象时,它会在许多地方查找其值,并且匹配的路由就是其中之一。如果您将您的属性名称从 id 更改为 personID,它将不会从路由值中填充,并且您必须在您的表单中放置隐藏字段才能将其放在那里。为了避免这种混淆,我总是命名与路由参数不同的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多