jQuery POST到ASP.NET MVC2动作,字符串是绑定,整数是不绑定的?

时间:2010-09-24 23:49:56

标签: jquery asp.net-mvc asp.net-mvc-2

这是JS:

$('#createReview').click(function () {
    CKEDITOR.instances['ReviewText'].updateElement();
    $.ajax({
        type: 'POST',
        cache: false,
        url: '/Review/Create',
        data: $('#reviewForm').serialize(),
        dataType: 'html',
        success: function (response) {
            $('#bookReview').html(response);
        }
    });
    return false;
});

'createReview'是

行动:

    [HttpPost, ExportModelState]
    public ActionResult Create(Review review)
    {
        if (ModelState.IsValid)
        {
            if (review.Create())
                return PartialView("EditReview", review);
        }

        return RedirectToAction("Edit");
    }

发布表单时,会创建审阅,但只有字符串属性绑定 - 在本例中为ReviewText。所有整数属性都没有绑定。

最奇怪的是,当我在调试模式下运行时, none 属性成功绑定,甚至不是ReviewText。当我检查Review对象时,所有内容都为null或默认值。

我在常规模式和调试之间来回走动,每次都做同样的事情。

我很茫然。

修改

以下是Serialize()调用的完整输出,它不适合注释:

得分= 0&安培;得分= 0&安培;得分= 0&安培;得分= 0&安培;得分= 0&安培;得分= 0&安培;得分= 0&安培;得分= 0&安培;得分= 0&安培;得分= 0&安培; Book.Review.Rating = 0&安培;等级= 0安培; ReviewID = 0&安培; ParentBookID = 1&安培; reviewText =%3CP%3E%0A%09I%26%2339%3BM +的+白痴%3C%2FP%3E%0A%3Cbr +%2F%3E%0A% 3Cdiv + firebugversion%3D%221.5.4%22 + ID%3D%22_firebugConsole%22 +风格%3D%22display%3A +无%3B%22%3E%0A%09%26nbsp%3B%3C%2Fdiv%3E% 0A%3Cbr +%2F%3E%0A&安培; dateCreated会= 1%2F1%2F0001 + 12%3A00%3A00 + AM

请注意,在我的整个数据库中找不到“得分”,所有关于Firebug的垃圾都在那里混合。

编辑#2:

好的,所有这些“得分”输入都来自jQuery Raty插件,该插件很快就没有插件了。

Firebug正在整理来自CKEditor实例的文本,该文本在提交表单之前甚至没有更新。

这个客户端的东西肯定是爆炸!

哎呀...

2 个答案:

答案 0 :(得分:3)

您尚未展示您的模型类如何与您的表单所包含的输入元素相似。试图重现这里的问题是我创建的一个工作示例。它应该非常接近你的场景:

型号:

public class Review
{
    public int ReviewID { get; set; }
    public int ParentBookID { get; set; }
    public int Rating { get; set; }
    public string ReviewText { get; set; }
    public int[] Scores { get; set; }
}

控制器:

public class ReviewController : Controller
{
    public ActionResult Edit()
    {
        var model = new Review
        {
            ReviewID = 1,
            Rating = 5,
            Scores = new[] { 1, 2, 3 }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Create(Review review)
    {
        if (ModelState.IsValid)
        {
            if (review.Create())
            {
                return PartialView("EditReview", review);
            }
        }

        // Notice that redirecting in an AJAX invoked action will simply
        // send an HTTP redirect to the Edit action and redisplay the whole page
        // which is probably not what you are looking for. Maybe it would be better
        // to return a partial here.
        return RedirectToAction("Edit");        
    }
}

查看:

<% using (Html.BeginForm("Create", "Review", FormMethod.Post, new { id = "reviewForm" })) { %>
    <div>
        <%: Html.LabelFor(x => x.ReviewID)%>
        <%: Html.TextBoxFor(x => x.ReviewID)%>  
    </div>
    <div>
        <%: Html.HiddenFor(x => x.ParentBookID)%>  
    </div>
    <div>
        <%: Html.LabelFor(x => x.Rating)%>
        <%: Html.TextBoxFor(x => x.Rating)%>  
    </div>
    <div>
        <%: Html.LabelFor(x => x.ReviewText)%>
        <%: Html.TextAreaFor(x => x.ReviewText)%>  
    </div>
    <%: Html.EditorFor(x => x.Scores)%>

    <input type="submit" value="Review" />
<% } %>

<div id="bookReview"></div>

脚本:

<script type="text/javascript" src="<%: Url.Content("~/scripts/jquery-1.4.1.min.js") %>"></script>
<script type="text/javascript">
$(function () {
    $('#reviewForm').submit(function () {
        $.ajax({
            type: this.method,
            url: this.action,
            data: $(this).serialize(),
            dataType: 'html',
            success: function (response) {
                $('#bookReview').html(response);
            }
        });
        return false;
    });
});
</script>

您还可以查看优秀的jquery form plugin,以便您的脚本简化为:

$(function () {
    $('#reviewForm').ajaxForm(function(response) {
        $('#bookReview').html(response);
    });
});

答案 1 :(得分:0)

我要继续把这个插件粉碎到一个糟糕的插件组合:Firebug,CKEditor和Raty。