为什么我必须指定[FromUri]才能使其正常工作?

cho*_*bo2 5 c# rest restsharp asp.net-web-api

我正在使用Asp.NET WebApi,让我感到困惑的一件事是请求完成时的绑定.

我有这个ViewModel:

[DataContract(Name="Store")]
public class StoreDm
{
    [DataMember(IsRequired = true)]
    [MinLength(3)]
    public string Name { get; set; }

    [DataMember(IsRequired = true)]
    public double Latitude { get; set; }

    [DataMember(IsRequired = true)]
    public double Longitude { get; set; }
}

public HttpResponseMessage GetStoreNames(StoreDm vm)
{
    if (ModelState.IsValid)
    {

    }
}

RestClient c = new RestClient("http://localhost:3333/api/store");
RestRequest r = new RestRequest("/GetStoreNames", Method.GET);
r.AddParameter("Name", autoComplete);
r.AddParameter("Latitude", "4");
r.AddParameter("Longitude", "-7");
var d =  c.BuildUri(r);
c.ExecuteAsync(r, response2 =>
  {
      var content = response2.Content;
  });
Run Code Online (Sandbox Code Playgroud)

我的StoreDm是空的.

我不是在这么多级别上得到这个.首先,我在所有属性上设置了IsRequired,无论出于何种原因,ModelState认为"null"ViewModel是有效的.

其次,我不明白为什么会这样null.我必须添加[FromUri]以使其绑定.如果这将是一个Post具有相同的restClient代码,但也有人使用fiddler正文请求会发生什么.

如果我被迫放弃,[FromUri]那么我认为小提琴体的请求不会起作用.

我怎么能拥有它,以便两个请求都通过并正确绑定?

Rad*_*ler 11

Web API参数绑定(从此处提取:路由和操作选择)执行此操作:

参数绑定.参数绑定是Web API为参数创建值的方式.以下是参数绑定的默认规则:

  • 简单类型取自URI.
  • 复杂类型来自请求正文.

因此,StoreDm默认情况下,任何复杂类型(如类都是)都应该是正文的一部分

如标准定义超文本传输​​协议 4.3消息正文中所述

消息中允许消息正文的规则因请求和响应而异.

通过在请求的消息头中包含Content-Length或Transfer-Encoding头字段来指示请求中消息体的存在.一个消息体必须不被包括在请求如果请求方法的(第5.1.1节)的规范不允许在请求中发送的实体主体.

因此,虽然Web API提供了一些常用功能,但它会尝试通用.可能有或没有消息体的请求.因此,有了这个,动作选择和参数绑定是常见的,没有推断特定的"当前"请求,也许是明显的设置(我们认为,GET将始终具有StoreDmURI中的所有参数(对象的属性).但引擎没有)

POST将绑定StoreDm开箱即用,因为它的属性就会在体内可以发现,对复杂对象的标准结合.

GET打破了规则,(复型)的特性在URI,所以我们只需要告知框架:[FromUri].在其他情况下,将找到Method,将传递null(从message-body限定)