我正在使用 ASP.NET Web API 和控制器类来处理来自客户端的 JSON 数据。我遇到了单个控制器需要多个 Put 方法的情况。
例子:
我可以拥有的一位客户
var box = {size:2,color:'red',height:45,width:12}
现在,如果我想更新整个盒子对象,我可以做一个
public void Put(Box box)
{
}
好的,我得到了这么多。
但我需要能够更新框的单个值,如下所示:
public void Put(int id, width value)
{
}
public void Put(int id, height value)
{
}
public void Put(int id, color value)
{
}
我将如何在我的 .net c# 控制器中映射额外的 Put 动词?
我将为我刚刚创建的赏金添加更多代码。我需要有人向我展示如何使我提供的代码工作。我需要将多个方法映射到一个httpVERB PUT
。原因是我需要对服务器上的项目进行微更新。就像名字一样,我不想通过网络发送一个大对象来更新一个字段,因为我的程序也将连接到移动设备。
---此代码不起作用,只返回PutName
而不是PutBrand
. 我也以您能想象到的任何方式切换了签名。
[AcceptVerbs("PUT")]
[ActionName("PutBrand")]
public HttpResponseMessage PutBrand(int id, int val)
{
return Request.CreateResponse(HttpStatusCode.Created, "Brand");
}
[AcceptVerbs("PUT")]
[ActionName("PutName")]
public HttpResponseMessage PutName(IDString idString)
{
return Request.CreateResponse(HttpStatusCode.Created, "Name");
}
public class IDString
{
public IDString() { }
public int ID { get; set; }
public string Value { get; set; }
}
- - 客户
$.ajax(
{
url: "/api/project",
type: "PUT",
data: JSON.stringify({ id: 45, val:'xxx' }),
contentType: "application/json",
success: function (result) {
}
});
---路由配置
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
建议的解决方案
$.ajax(
{
url: "/api/project?a=name",
type: "PUT",
$.ajax(
{
url: "/api/project?a=brand",
type: "PUT",
$.ajax(
{
url: "/api/project?a=size",
type: "PUT",
当然我会用一个变量来代替 a=myJavaScriptVariable
public HttpResponseMessage Put(Project project)
{
string update = HttpContext.Current.Request.QueryString["a"];
switch (update)
{
case "name":
break;
case "brand":
break;
case "size":
break;
default:
break;
}
return Request.CreateResponse(HttpStatusCode.Accepted);
}