2013-09-11 3 views
0

У меня есть WebAPI со следующей моделью:Реализация WebAPI с уникальным ключом

public class Dog 
{ 
    public string name { get; set; } 
    public string breed { get; set; } 
    public string size { get; set; } 
    public CoatType coatType { get; set; } 

    private List<Dog> dogs; 
} 

public enum CoatType 
{ 
    Long, 
    Short, 
    Curly 
}; 

Мой репозиторий выглядит следующим образом:

public class AnimalRepository 
{ 
    private const string CacheKey = "AnimalStore"; 

    public AnimalRepository() 
    { 
     var context = HttpContext.Current; 

     if (context != null) 
     { 
      if (context.Cache[CacheKey] == null) 
      { 
       var contacts = new Dog[] 
       { 
        new Dog { name = "Lassie", breed = "Collie", size = "Medium", coatType = CoatType.Long }, 
        new Dog { name = "Fido", breed = "Labrador", size = "Large" , coatType = CoatType.Short}, 
       }; 

       context.Cache[CacheKey] = contacts; 
      } 
     } 
    } 

    public Dog[] GetAllAnimals() 
    { 
     var context = HttpContext.Current; 

     if (context != null) 
     { 
      return (Dog[])context.Cache[CacheKey]; 
     } 

     return new Dog[] 
     { 
      new Dog 
      { 
       name = "", 
       breed = "Placeholder", 
       size = "Placeholder", 
       coatType = CoatType.Curly 
      } 
     }; 
    } 

    public bool SaveAnimal(Dog animal) 
    { 
     var context = HttpContext.Current; 

     if (context != null) 
     { 
      try 
      { 
       var currentData = ((Dog[])context.Cache[CacheKey]).ToList(); 

       bool nameExists = false; 

       if (nameExists != true) 
       { 
        currentData.Add(animal); 
        context.Cache[CacheKey] = currentData.ToArray(); 

        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
       return false; 
      } 
     } 

     return false; 
    } 
} 

И мой контроллер выглядит следующим образом:

public class AnimalController : ApiController 
{ 
    private AnimalRepository repository; 

    public AnimalController() 
    { 
     this.repository = new AnimalRepository(); 
    } 

    public Dog[] Get() 
    { 
     return this.repository.GetAllAnimals(); 
    } 

    public HttpResponseMessage Post(Dog animal) 
    { 
     this.repository.SaveAnimal(animal); 
     var response = Request.CreateResponse<Dog>(System.Net.HttpStatusCode.Created, animal); 

     return response; 
    } 

My Index.cshtml выглядит так:

<header> 
<div class="content-wrapper"> 
    <div class="float-left"> 
     <p class="site-title"> 
      <a href="~/">Field<b>Connect</b></a></p> 
    </div> 
</div> 
</header> 
<div id="body"> 
<ul id="animals"></ul> 
<form id="saveForm" method="post"> 
<h3>New Dog</h3> 
    <p> 
     <label for="name">Name:</label> 
     <input type="text" name="name" /> 
    </p> 
    <p> 
     <label for="breed">Breed:</label> 
     <input type="text" name="breed" /> 
    </p> 
    <p> 
     <label for="size">Size:</label> 
     <input type="text" name="size" /> 
    </p> 
    <p> 
     <label for="coatType">Coat Type:</label> 
     <select name="coatType"> 
      <option value="Long">Long Hair</option> 
      <option value="Short">Short Hair</option> 
      <option value="Curly">Curly Hair</option> 
     </select> 
    </p> 
    <input type="button" id="saveAnimal" value="Save" /> 
</form> 
</div> 

@section scripts{ 
<script type="text/javascript"> 
$(function() { 
    $.getJSON('/api/animal', function (contactsJsonPayload) { 
     $(contactsJsonPayload).each(function (i, item) { 
      $('#animals').append('<li>' + item.name + '</li>'); 
     }); 
    }); 
}); 

$('#saveAnimal').click(function() { 
    $.post("api/animal", 
      $("#saveForm").serialize(), 
      function (value) { 
       $('#animals').append('<li>' + value.name + '</li>'); 
      }, 
      "json" 
    ); 
}); 
</script> 
} 

Все это прекрасно работает. Я показываю на своей веб-странице две собаки, которые являются частью определенной коллекции. Тем не менее, я пытаюсь сделать это до того, как я сохраню новую собаку в коллекции, которую я хочу проверить, чтобы увидеть, существует ли эта собака в коллекции. Поэтому я начал реализовывать цикл forach в AnimalRepository.cs сразу после строки кода: bool nameExists = false; строка кода.

// Check to see if the name of the animal already exists 
for (int i = 0; i < currentData.Count; i++) 
{ 
    foreach (var item in currentData[i]) 
    { 
     if (item.Equals(currentData[i].name)) 
     { 
      nameExists = true; 
     } 
    } 
} 

Но когда я строю я получаю ошибку, что я не могу перебирать эту коллекцию, если я не реализовать IEnumerable, так что я сделал это. Я добавил: IEnumerable в мой класс, чтобы наследовать от интерфейса и я добавил следующий код в класс Dog, завершенный ниже ....

public class Dog : IEnumerable<Dog> 
{ 
    public string name { get; set; } 
    public string breed { get; set; } 
    public string size { get; set; } 
    public CoatType coatType { get; set; } 

    private List<Dog> dogs; 

    public IEnumerator<Dog> GetEnumerator() 
    { 
     if (dogs != null) 
     { 
      foreach (Dog dog in dogs) 
      { 
       if (dog == null) 
       { 
        break; 
       } 

       yield return dog; 
      } 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     // Lets call the generic version here 
     return this.GetEnumerator(); 
    } 
} 

public enum CoatType 
{ 
    Long, 
    Short, 
    Curly 
}; 

Но теперь, когда я запускаю код, вместо того, чтобы видеть имя собаки в верхней части страницы я вижу «undefined». Я попытался вернуть IEnumerable строки типа вместо Dog, но это не помогло. Любые идеи, как я могу это решить?

ответ

0
for (int i = 0; i < currentData.Count; i++) 
{ 
    foreach (var item in currentData[i]) 
    { 

Это вложенные петли - вы уверены, что хотите второй? currentData[i] должен быть Dog, чье Name вы можете проверить напрямую. Часть путаницы заключается в том, что у вашего класса Dog есть список Dogs - это почти наверняка не то, что вы хотите.

Смежные вопросы