2011-07-10 9 views
0

を継承するクラスを受け入れることはありませんこの上記のコードは、得られたデータセットに含まれる各アドレスからアドレスを構築し、その目的は、背面に各アドレスを記憶するようにNULLを返すContentResultに送り返しASP.NET MVC 3 ContentResultは、これは私がここに尋ねた別の質問を、以下の別のクラス

var loc = new Array(); 
    loc[0] = results[i].Longitude; 
    loc[1] = results[i].Latitude; 

    var address = { 
     AddressLine1: results[i].Address, 
     City: results[i].City, 
     State: results[i].StateOrProvince, 
     PostalCode: results[i].PostalCode, 
     Latitude: results[i].Latitude, 
     Longitude: results[i].Longitude, 
     Country: results[i].CountryOrRegion, 
     ID: results[i].UniqueId 
    }; 

    $.ajax({ 
     url: "/Home/AddAddressToCollection", 
     type: 'post', 
     data: JSON.stringify(address), 
     contentType: 'application/json', 
     dataType: 'json' 
    }); 

:次のコードを追加しましMongoDBです。なぜ私がこのアプローチを取っているのか疑問に思うかもしれません。アドレスはMongoDBのシードデータです。アイデアはこれがオープンソースプロジェクトであることと、開発者のGeoLocationで検出された場所に対応するローカライズされたアドレスセットを与えることでパーソナライゼーションを追加したいと考えています。ここで

はにHomeControllerでContentResultのコードです:

[HttpPost] 
    public ContentResult AddAddressToCollection(Address address) 
    { 
     address.GeoInsert(_dbName, ref _repository); 
     return null; 
    } 

私のアドレスクラスはそうのように表示されたときにこのコードはcorresponing POSTメソッドで作業を行います。

パブリッククラスAddress { プライベートダブル_latitude ; プライベートdouble _longitude;私は好奇心が強いところ

[Key] 
    [Required] 
    [HiddenInput(DisplayValue=false)] 
    public string ID { get; set; } 

    [Required] 
    [HiddenInput(DisplayValue = false)] 
    public virtual Guid AccountID { get; set; } 

    [Required] 
    [Display(Name = "Address Line 1")] 
    public string AddressLine1 { get; set; } 

    [Display(Name = "Address Line 2")] 
    public string AddressLine2 { get; set; } 

    [Required] 
    [Display(Name = "City")] 
    public string City { get; set; } 

    [Required] 
    [Display(Name = "State")] 
    public string State { get; set; } 

    [Required] 
    [Display(Name = "Zip Code")] 
    public string PostalCode { get; set; } 

    public string Country { get; set; } 

    [Required] 
    [HiddenInput(DisplayValue = false)] 
    public double[] Location { get; set; } 

    [Required] 
    [HiddenInput(DisplayValue = false)] 
    public double Latitude 
    { 
     get { return _latitude; } 
     set 
     { 
      Location[1] = value; 
      _latitude = value; 
     } 
    } 

    [Required] 
    [HiddenInput(DisplayValue = false)] 
    public double Longitude 
    { 
     get { return _longitude; } 
     set 
     { 
      Location[0] = value; 
      _longitude = value; 
     } 
    } 

    public Address() 
    { 
     Location = new double[2]; 
    } 

    public void GeoInsert(string dbName, ref Repository repository) 
    { 
     repository.MongoGeoInsert(dbName, this); 
    } 

    public Dictionary<Address, double> GeoNear(string dbName, ref Repository repository, double maxKilometers, int limitResults) 
    { 
     return repository.MongoGeoNear<Address>(dbName, this.Latitude, this.Longitude, maxKilometers, limitResults); 
    } 

} 

しかし、ここでは、私は今、これを必要としませんが、私が最初にいくつかのカスタムを支援するために、同じ基本クラスから継承するために私のモデルに私のクラスのすべてを持ってしようとした...です私が使用する直列化メソッド。私がそのようなクラスから継承するとき、それをBaseClassと呼ぶことにしましょう、POSTはもはや動かず、私はサーバーから500の応答を得ます...私は理由が何であるかはっきりしていません。ここでは、私が話していることの例を示します(psでは、以下のコードを使用した場合、シリアライズのためにディクショナリを使用する方法を理解する必要があるというヒントですが、

をこんなに早く、Addressクラスのために、私が持っているでしょう:

住所:ように反射して、私は)ここに一緒に行くんだよBaseClassの

をし、コンストラクタは次のようになり...

住所:base( "Address") { //ベース( "Address")は必要ありませんがあなたは辞書に //シリアライズ方法 }今

BaseClassの...

public class Serialization 
{ 
    public abstract class BaseObject 
    { 
     [BsonId(IdGenerator = typeof(CombGuidGenerator))] 
     public Guid? Id { get; set; } 

     public string ObType { get; private set; } 

     public BaseObject() : this("base") { } 

     public BaseObject(string obType) 
     { 
      ObType = obType; 
      Id = Guid.NewGuid(); 
     } 

     public virtual BaseObject Parse(XElement xml) 
     { 
      PropertyInfo[] properties = this.GetType().GetProperties(); 

      foreach (var property in properties) 
      { 
       ElementName attribute = Attribute.GetCustomAttribute(property, typeof(ElementName)) as ElementName; 
       if (attribute == null) continue; 

       object value = null; 
       string stringValue = xml.Element(attribute.Name).Value; 

       switch (property.PropertyType.Name.ToLower()) 
       { 
        case "double": 
         { 
          value = double.Parse(stringValue); 
          break; 
         } 
        default: 
         { 
          value = stringValue; 
          break; 
         } 
       } 

       property.SetValue(this, value, null); 
      } 

      return this; 
     } 

    } 

    public class Serializer 
    { 
     public static T Deserialize<T>(XElement xml) 
      where T : BaseObject, new() 
     { 
      BaseObject obj = new T() as BaseObject; 
      if (obj != null) 
      { 
       //populate obj properties... 
       obj.Parse(xml); 
      } 
      return obj as T; 
     } 
    } 
} 

大丈夫を使用している場合を除き、私はそれが十分情報をすべきだと思います...任意のアイデアはどのようなことはないだろう作業?うまくいけば、私はここで非常に明白な何かを見逃しているわけではありません...しかし、私はASP.NETプログラミングよりもはるかにSilverlightを行うので、私は完全に可能です0:

ありがとう!

+0

ファイアバグを開いて、どのようなエラーが表示されますか? –

+0

ええ、これはかなり標準的な500のエラーです: POST/Home/AddAddressToCollection 500内部サーバーエラー 私はクライアント側のコードを知っているので、MVCフレームワークがコンテンツとアクションの結果を処理する方法と関係があると思います(BaseClassから継承していないときに動作するため) – Jordan

答えて

0

ここでの最初の問題は、質問の範囲がの方法が大きすぎるということです。

まず、この「ブラックボックス」サーバーにAJAXリクエストを送信します。しかし、それであなたはサーバー用のコードを持っていることが判明しました。なぜ、最初にAJAXリクエストが気になるのですか?開始場所:

  1. シリアル化が正しく機能していますか?カスタムシリアル化基本クラスが実際に動作することを証明するテストがありますか? (入力を偽装するのは簡単なはずです)もしそうでなければ、おそらくエラーが発生します。
  2. MongoDBにデータが正しく入っていますか?そうでない場合は、例外をスローしてエラーが発生する可能性があります。 CSharpドライバhas its own serializationに注意してください。あなたはそれを壊しているかもしれません。
  3. 同じデータがビューに表示されていることを確認できますか?あなたのビューは、正しく存在しないいくつかのフィールドに依存しているので、爆発している可能性があります。

この問題は、典型的な単体テストカバレッジで診断するのは非常に簡単です。 1つのクラスに1つの変更を加えたので、あなたのテストスイートは、上記の3つのうちの1つであるかなり明確なメッセージを投げているはずです。

テストスイートでエラーが発生していない場合は、いくつかの重要なテストが明確に欠落しています。

テストカバレッジがない場合は、開始するのがよいかもしれません。

+0

シリアライゼーションコードは完全にテストされていますが、この例ではシリアライズを使用していません。明確にするために、このクラスを先見的に追加して、シリアル化を使用したいと思うかもしれませんが、それは問題ではありません。私はコードが動作するので、内部エラーを投げているMVCフレームワークに関連していると確信しています。これらの行に沿って、確かに、私はこのエラーを説明しませんでしたが、私はこのエラーのためにテストを行った場合、なぜこの質問をしていますか? – Jordan

+0

ゲイツは、あなたが私のモンゴーコードによって捨てられている場合に備えて、モンゴーの使用を簡素化するために、カスタムのモンゴーのセットを書いた。私はMongoのシリアル化に非常に精通しており、これはそれとは関係ありません。相互運用性を簡素化し、トランスポート/ストレージのコストを軽減するために、カスタムxml/jsonシリアライザを使用して、特定のクラスに関するデータを渡したり保存することがよくあります。 – Jordan

関連する問題