JQuery POST для ASP.NET MVC2 действие, строка является обязательной, целые не являются обязательными ...? - PullRequest
0 голосов
/ 25 сентября 2010

Вот 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.Ни одно из целочисленных свойств не является обязательным для всех.

Самым странным является то, что, когда я запускаю его в режиме отладки, нет свойств, успешно связывающихся, даже даже 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% 3БМ + ап +идиотом% 3C% 2FP% 3E% 0A% 3Cbr +% 2F% 3E% 0A% 3Cdiv + firebugversion% 3D% 221.5.4% 22 +% 3D ID% 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

Обратите внимание, что "Score "нигде не найти во всей моей базе данных, и все это барахло о Firebug смешано там.

Edit # 2:

ОК, так что все"Оценка "поступает от плагина jQuery Raty, который был быстро отключен-ed.

Firebug собирает текст, поступающий из экземпляра CKEditor, который даже не обновляется до отправки формы.

Этот материал на стороне клиента, безусловно, взрыв!

Гррр ...

Ответы [ 2 ]

3 голосов
/ 25 сентября 2010

Вы не показали, как выглядят ваши классы моделей, и из каких элементов ввода состоит ваша форма. Пытаясь воспроизвести проблему, вот рабочий пример, который я создал. Это должно быть довольно близко к вашему сценарию:

Модель:

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 , чтобы ваш скрипт упростил до этого:

$(function () {
    $('#reviewForm').ajaxForm(function(response) {
        $('#bookReview').html(response);
    });
});
0 голосов
/ 28 сентября 2010

Я собираюсь пойти дальше и записать это на плохую комбинацию плагинов: Firebug, CKEditor и Raty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...