JSON / MVC (3P1) httpPOST - не получите его для работы на моем классе EF

StackOverflow https://stackoverflow.com/questions/3410294

Вопрос

В смешивании и сопоставлении более старых учебных пособиях с последними сообщениями на MVC 3 Preview 1 я столкнулся с следующей проблемой. Я пытаюсь переехать на JSON-Editts My Fighter Модель (и базовая БД) вместо «простых старых» редактирует без JSON.

У меня есть вид редактирования (который использует Shared EditorTemplate, fighter.ascx) Настройка для моего Fighter Класс (который существует в модели EF 4).

На этом у меня есть 2 кнопки. Один «старый» один, который является представлением, которое называет мой EditController без JSON, и один новый, для которого я написал новый HttpPost ActionResult

Старая кнопка работает: новая кнопка - это только наполовина реализована, но уже я вижу, что ActionResult UpdateJsonTrick не получает данные из представления правильно. То returnMessage Строка гласит: «Создан истребитель» в системе ». Прежде чем я смогу сделать что-нибудь полезное в том, что ActionResult, я должен знать, как пройти эти данные. Где я пойду не так?

Итак, Edit.aspx просто простой Html.EditorForModel("Fighter") утверждение,Но вот истребитель .ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Mvc3_EF_BW_Fight.Models.Fighter>" %>
<% using (Html.BeginForm())
   {%>
<%: Html.ValidationSummary(true) %>
<script type="text/javascript" src="../../../Scripts/jquery-1.4.1.min.js"></script>
<script type="text/javascript" src="../../../Scripts/json2.js"></script>
<script type="text/javascript">
    $(document).ready(function () {

        $("#JSONTRICK").click(function (event) {

            var fighter = { Id: $('#Id').val(),
                FighterName: $('#FighterName').val(),
                FighterStyleDescription: $('#FighterStyleDescription').val(),
                FighterLongDescription: $('#FighterLongDescription').val()

            };

            $.ajax({
                url: '/Barracks/UpdateJsonTrick',
                type: "POST",
                data: JSON.stringify(fighter),
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    // get the result and do some magic with it
                    var message = data.Message;
                    $("#resultMessage").html(message);
                },
                error: function () {
                    $('#message').html('oops Error').fadeIn();
                }
            });

            return false;
        });


    });
</script>
<fieldset>
    <legend>Fighter template</legend>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.Id) %>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.Id) %>
        <%: Html.ValidationMessageFor(model => model.Id) %>
    </div>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.FighterName) %>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.FighterName) %>
        <%: Html.ValidationMessageFor(model => model.FighterName) %>
    </div>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.FighterStyleDescription) %>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.FighterStyleDescription) %>
        <%: Html.ValidationMessageFor(model => model.FighterStyleDescription) %>
    </div>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.FighterLongDescription) %>
    </div>
    <div class="editor-field">
        <%: Html.TextAreaFor(model => model.FighterLongDescription) %>
        <%: Html.ValidationMessageFor(model => model.FighterLongDescription) %>
    </div>
    <p>
        <input type="submit" value="Save" id="save" />
    </p>
    <p>
        <input type="submit" value="JSONTRICK" id="JSONTRICK" />
        <label id="message">
            message</label>
    </p>
    <div>
        <span id="resultMessage"></span>
    </div>
</fieldset>
<% } %>

А вот (актуальный бит от) контроллера:

[HttpPost]
public ActionResult Edit(int id, FormCollection collection) //Works
{
   var fighter = _FightDb.Fighters.Single(f => f.Id == id);

    try
    {
        UpdateModel(fighter);
        //var x = ViewData.GetModelStateErrors();
        _FightDb.SaveChanges();

        return RedirectToAction("Index");
    }
    catch
    {
        var viewModel = _FightDb.Fighters.Single(f => f.Id == id);  //fighter;

        return View(viewModel);
    }

}

[HttpPost]
public ActionResult UpdateJsonTrick(Fighter fighter) //doesn't work
{
    var x = ViewData.GetModelStateErrors();
    string returnMessage = string.Format("Created fighter '{0}' in the system.", fighter.FighterName);
    return Json(new PersonViewModel { Message = returnMessage });

}

Спасибо за ваше терпение, если вам нужен дополнительный код или информация, я могу поставить.

Это было полезно?

Решение

Есть ошибка в MVC 3 превью 1 где JsonValueProviderFactory не зарегистрирован по умолчанию.

Иметь что-то вроде этого в вашем Global.asax Должна помочь:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory())
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top