0

考虑一个模型类

public class MyModel
{
    public string Id { get; set; }

    /* some other properties */
}

和一个控制器

public class MyController
{
    [HttpPut]
    public ActionResult Update(string id, MyModel model)
    {
        /* process */
    }
}

路由注册如下:

protected override void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute("MyController", 
                    "api/my/{id}",
                     new { action = "Update", controller = "My"},
                     new { httpMethod = new HttpMethodConstraint(new[] { "PUT" }) });

}

当使用 REST 客户端并将 MyModel 序列化为 JSON 或 XML 请求发送到此控制器时,“MyModel”的空“Id”属性会覆盖操作方法的“id”参数,即使您将其发布到http:/ /api.example.com/api/my/10

如何强制 ASP.NET MVC 3 从 URL 填充“id”属性(在本例中为“10”)并忽略“MyModel”的“Id”属性?

请注意,我没有使用 ASP.NET Web API。

4

1 回答 1

2

尝试使用属性[FromUri]。它在“System.Web.Http”中。action param id 上的这个属性表明它应该使用 url 请求进行绑定。

using System.Web.Http;//at the top
public class MyController
{
    [HttpPut]
    public ActionResult Update([FromUri]string id, MyModel model)
    {
       /* process */
    }
}

对于 MVC3 尝试包含 web-api 包(来自 nuget 或手动)以使用 [FromUri] 属性。如果这是不可能的,那么我能想到的唯一方法就是从this.HttpContext.Request.QueryString["id"]

而不是将 id 作为动作方法参数在动作主体中声明它。可能要更改 url 查询 api/my?id=1212。首先尝试使用 api/my/{id} 格式。

var id = this.HttpContext.Request.QueryString["id"];
于 2012-06-04T05:04:54.487 回答