使用Jquery Ajax将模型从视图传递到控制器

3

我希望能够通过Ajax将我的ViewModel从View传递到Controller,我的代码如下,我需要显示警报框,但是我遇到了一个错误: "Invalid JSON primitive: info。"

控制器:

[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>

模型:

public partial class 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 从视图传递到控制器中。

提前感谢!


可能是重复的问题:Invalid JSON primitive: id - CodeCaster
1个回答

3

修改

data: {info:JSON.stringify(check)}

To

data: '{info:' + JSON.stringify(check) + '}' 

请参阅此问题

(相关内容与IT技术有关)

这对我有用,但我必须在我的警告框中显示“return Json(new {success = true});”和“return Json(new {error = true,message =”Ftp测试失败:“+ ex.Message})”。 - Santosh Mishra
那么,这有什么问题吗? - CodeCaster
我必须在第一次返回时显示“测试通过”,在第二次返回时显示“FTP测试失败”。 - Santosh Mishra
@SantoshMishra,你不应该使用alert()进行调试。这不是很明显吗?你正在将一个对象转换为字符串,通常看起来像“[object][object]”。你可以使用浏览器的调试工具,或者alert()要查看的对象属性(例如:alert(data.FtpPath);)。 - CodeCaster
所以你的意思是我需要用"alert(data.FtpPath);"替换"alert(data);"吗? - Santosh Mishra
@SantoshMishra 我确实帮了你,给了你一些可以尝试的指针。那么就去尝试吧,不要等我把它讲得清清楚楚。 :-) - CodeCaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接