Frage

Beim Mischen und Abgleich älterer Tutorials mit den aktuellen Beiträgen zu MVC 3 Preview 1 bin ich auf das folgende Problem gestoßen. Ich versuche, zu JSON-gesteuerten Bearbeitungen von mir zu wechseln Fighter Modell (und die zugrunde liegende DB) anstelle von "einfachen alten" Änderungen ohne JSON.

Ich habe eine Bearbeitungsansicht (die a verwendet Shared EditorTemplate, fighter.ascx) Setup für meine Fighter Klasse (die in einem EF 4 -Modell existiert).

Darauf habe ich 2 Knöpfe. Ein 'alter', der eingereicht wird, der meinen EditController ohne JSON anruft, und einer ist ein neuer, für den ich eine neue geschrieben habe HttpPost ActionResult

Der alte Knopf funktioniert: Der neue Knopf ist nur halb implementiert, aber ich kann bereits sehen, dass das ActionResult UpdateJsonTrick Empfängt die Daten nicht korrekt aus der Ansicht. Das returnMessage String liest: "Kämpfer" im System erstellt. " Bevor ich in diesem ActionResult etwas Nützliches tun kann, muss ich wissen, wie ich diese Daten übergeben kann. Wo gehe ich falsch?

Also, der edit.aspx ist einfach einfach Html.EditorForModel("Fighter") Aussage,Aber hier ist der 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>
<% } %>

Und hier ist das (relevante Bit aus dem) Controller:

[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 });

}

Vielen Dank für Ihre Geduld, wenn Sie zusätzlichen Code oder Informationen benötigen, kann ich liefern.

War es hilfreich?

Lösung

Es gibt einen Fehler in MVC 3 Preview 1, wobei die JsonValueProviderFactory ist standardmäßig nicht registriert.

So etwas in deinem Global.asax sollte helfen:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory())
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top