C#MVC 4/5 - Id存储在哪里?

时间:2014-08-28 06:13:57

标签: c# asp.net-mvc asp.net-mvc-4 model-binding

我需要帮助来理解这件事。

假设我有一个像这样的行动

    [HttpGet]
    public ActionResult Edit(int id)
    {
      var model = new Model();
      return View(model);
    }

像这样的行动

    [HttpPost]
    public ActionResult Edit(Model model, int id)
    {

    }

问题:

当我执行GET请求时(例如http://url.com/controller/Edit/2

然后action方法的id将具有值2,我们将看到编辑视图。

现在,当我更改网址中的ID时(例如http://url.com/controller/Edit/4) 并向其他ActionMethod提交(POST),id仍将具有值2.(而不是4!我期望的那样)

这是为什么?有人可以向我解释一下吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

ASP.NET MVC按以下顺序使用值提供程序:

  1. 以前绑定的操作参数,当操作是子操作时
  2. 表单字段
  3. JSON请求正文中的属性值(对于AJAX请求)
  4. 路线数据
  5. 查询字符串参数
  6. 发布文件
  7. 因此,当模型绑定器尝试查找参数id的值时,它首先在请求中查找表单数据。因此,您传递的Model具有名称为id的属性,其表单数据将如下所示:

    id=2&name=foo
    

    因此它成功地在表单数据中找到名为id的参数匹配,并且不会进一步分析路由数据或查询字符串。

    如果您要修改请求中传递的表单数据并删除id=2部分,则查询字符串中的id参数将同时用于操作的模型和id参数。

    你不能在这里使用自动绑定,但你总是可以手动获取查询字符串参数(虽然我发现这种方法非常混乱 - 更好的方法将使用id参数的不同名称):

    string id = Request.QueryString.Get("id");
    

    建议阅读:The Features and Foibles of ASP.NET MVC Model Binding