2016-04-05 12 views
2

Bağlam: ASP.NET Web API v2Boş bir null olan Guid veya geçersiz bir sorgulamada nasıl ayırt edilir?

buna benzer bir URL Verilen:

Web yöntemi böyle bir "id" sorgu dizesi parametresi tanımlamaktadır http://localhost/something?id=cbc66d32-ece8-400f-a574-e36b911e1369

:

[FromUri] Guid? id = null 

Daha sonra, web yöntemi "asdf" gibi geçersiz bir şey olsun veya tamamen yumuşatılmış olsun, id değişkeni null ile doldurulur olsun, çağrılır.


Biz geçersiz Guid üzerinde müşteriye bir HTTP 400 atmak, ama boş birinde geçerli bazı genel işlem yapmak gerekir. Bunlar çok farklı sonuçlar. Bu yüzden onları ayırt etmemiz gerekiyor ama yöntem çağrısında aynı girişi almamız gerekiyor.

ASP.NET Web API'sini, tüm kart üzerindeki geçersiz Guid'ler üzerinde bir HTTP 400 yayınlayacak şekilde yapılandırmanın etkili bir yolu var mı? Nullable Guid'leri oldukça sık kullanıyoruz ve bu tür davranışları her zaman bekliyoruz.

+0

Ne? 'Kullanabilir ve içi boş olduğunda sizin boş bir durumdur. Ve eğer değilse, ayrıştırmaya çalışın ve geçerli bir Guid olup olmadığını doğrulayabilirsiniz. – Hypnobrew

+0

Gerçekten de işe yarayacaktı, ancak her bir yöntem çağrısında bu kodu kod çözücü olarak null olmayan bir kılavuz kullanarak yazmak zorundayız. Ayrıca, bu parametrenin özellikle bir Rehber olması gerektiğini bilemeyen otomatik bir dokümantasyon aracımız var. – RooSoft

+0

Kimlik özelliğini doğru şekilde yüklerken ve asılları doğru şekilde yakalarken "asdf" yi bir dize olarak ele alabilir misiniz? http://stackoverflow.com/questions/14353466/overload-web-api-action-method-based-on-parameter-type –

cevap

1

Bunun yerine `Guid bir dize olarak` id parameter` alma konusunda özel bir model Bağlayıcı

public IHttpActionResult Get([ModelBinder(typeof(GuidParserModelBinder))] Guid? id = null) 
{ 
    return Json(id); 
} 

public class GuidParserModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, 
     ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType != typeof (Guid?)) 
      return false; 

     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     var rawValue = value.RawValue.ToString(); 

     if (string.IsNullOrWhiteSpace(rawValue)) 
      return false; 

     Guid guid; 
     if (Guid.TryParse(rawValue, out guid)) 
     { 
      bindingContext.Model = guid; 
      return true; 
     } 

     // throw exception or logic here 
     return false; 
    } 
} 
+0

İyi bir başlangıç ​​olabilir. Bazı Kılavuzlar diğerleriyle ilişkili olabileceğinden, ModelBinder'daki querystring anahtarı kodlanmamalıdır. – RooSoft

+0

@RooSoft Sorunuzda bu tür bir esnekliğe ihtiyaç duyduğunuzdan bahsetmediniz. Cevabımda güncellediğim gibi bindingContext.ModelName'i kullanabilirsiniz. –

İlgili konular