ViewModel を View から Controller に渡したいのですが、これには Ajax を使用しています。コードは次のとおりで、アラート ボックスを表示する必要があり、「無効な JSON プリミティブ: 情報」というエラーが表示されます。
コントローラ:
[HttpPost]
public JsonResult Test(OData.FtpAccount info) {
try {
string FileName = Utils.File.TempName + ".txt";
FtpClient ftp = GetClient(info);
UnicodeEncoding uni = new UnicodeEncoding();
byte[] guid = uni.GetBytes(Utils.File.TempName);
FileName = info.Root + (info.Root.EndsWith("/") ? "" : "/") + FileName;
ftp.Upload(GetTempFile(guid),FileName); //Upload File to Ftp in FtpPath Directory.
string url = info.GetHttpUrl(FileName);
byte[] result = Utils.Web.ReadByte(new System.Uri(url));
ftp.FtpDelete(FileName);
if (uni.GetString(result) == uni.GetString(guid)) {
return Json(new{ success=true});
} else {
return Json(new { warning = true, message = "Warning : Test Upload worked, Test Delete Worked, Http Access of File did not return same content as uploaded." });
}
} catch (System.Exception ex) {
return Json(new { error = true, message = "Ftp Test Failed : " + ex.Message });
}
}
意見:
@model VZDev.ViewModels.FtpAccountViewModel
@{
ViewBag.Title = "Watch";
var val = Json.Encode(Model);
}
<div class="control-group">
<div class="controls">
<button type="button" class="btn" id="test"><i class="icon-test"></i> Test</button>
</div>
</div>
}
<script type="text/javascript">
$(function () {
$("#test").click(function () {
var check=@Html.Raw(val);
$.ajax({
type: 'post',
url: rootURL + 'Ftp/Test',
data: {info:JSON.stringify(check)},
contentType: 'application/json; charset=utf-8',
dataType: "json",
success: function (data) {
alert(data);
}
});
});
});
</script>
モデル:
パブリック部分クラス FtpAccount {
[DataMember(Order = 1)]
[ScaffoldColumn(false),DatabaseGenerated(DatabaseGeneratedOption.Identity),Key,UIHint("Id"),Display(Name="Id")]
[Column("ID")]
public long ID{get;set;}
[DataMember(Order = 2)]
[UIHint("Service Provider"),Display(Name="Service Provider"),Required(ErrorMessage="Service Provider is required"),StringLength(100)]
[Column("ServiceProvider")]
public string ServiceProvider{get;set;}
[DataMember(Order = 3)]
[UIHint("Ftp Path"),Display(Name="Ftp Path"),Required(ErrorMessage="Ftp Path is required"),StringLength(500)]
[Column("FtpPath")]
public string FtpPath{get;set;}
}
}
ここで、ViewModel をビューからコントローラーに渡したいと思います。前もって感謝します!!!