2012-04-30 25 views
0

我試圖用座標的陣列發送到MVC控制器 我正在做這樣的(未發佈的所有代碼,只有相關):MVC - 發送與JavaScript + AJAX陣列控制器

var coords = []; 
..for loop 
    coords.push({ X: x, Y: y}); 
..end of loop 

然後我就做下面的對象作爲數據

var data = { 
    OtherData: "SomeString", 
    OtherData2: 1, 
    Coords: coords 
}; 

Ajax調用當調試控制器中的其他數據被正確解析 行動上我希望這個模型看起來像這樣

public class Model 
{ 
    public int OtherData2 { get; set; } 
    public string OtherData { get; set; } 
    public Point[] Coords { get; set; } 
} 

我已經嘗試過 - 使用列表 - 兼與X和Y性 一類簡單的點 - 發送X和Y值的字符串值 - 發送X和Y值連接起來作爲1串和接收字符串

在點對象數組我得到與等量點列表的案件清單,但他們都是空的(0,0)與列表對象的名單只是空 任何想法?

也許一個重要的注意的是,我使用MVC4

回答

0

貌似DefaultModelBinder不知道如何綁定到一個列表,
(它缺少正確的類型轉換器) 你可以做什麼創建自己的點和類型轉換器它:

[TypeConverter(typeof(PointTypeConverter))] 
public class Point 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
} 

/// <summary> 
/// we need this so we can use the DefaultModelBinder to bind to List<Point> 
/// example at http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx 
/// </summary> 
public class PointTypeConverter : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return true; 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     Point ret = serializer.Deserialize<Point>((string)value); 
     return ret; 
    } 

} 

控制器動作看起來就像這樣:

[HttpPost] 
public ActionResult testPoints(List<Point> cords) 
{ 
    //party 
} 

和Ajax調用是這樣的:

$.ajax({ 
url: "/Home/testPoints/", 
type: "POST", 
data: { 
      //note that i stringify very value in the array by itself 
    cords: [JSON.stringify({'X':1,'Y':2}),JSON.stringify({'X':3,'Y':4})] 
}, 
success: function (data) 
{ 
    //client party 
} 
}); 

測試這一切MVC3,並沒有理由它不會在MVC4工作 希望這有助於

+0

謝謝,我就知道讓我自己ModelBinder的或ConverterClass是一種選擇,但我不喜歡的選項。感謝您的回答,可能是唯一正確的解決方案。 – YentheO

相關問題