Domanda

In miscelazione e la congruenza tutorial più anziani con i recenti messaggi su MVC 3 Anteprima 1, mi imbatto nel seguente problema. Sto cercando di passare a modifiche JSON-driven del mio modello Fighter (e il db sottostante) invece di modifiche 'Plain Old' senza JSON.

Ho una vista edit (che utilizza un Shared EditorTemplate, fighter.ascx) di impostazione per la mia classe Fighter (che esiste un modello EF 4).

In questa ho 2 pulsanti. Un 'vecchio' uno, che è una sostengono che chiama il mio editcontroller senza JSON, e uno è uno nuovo, per il quale ho scritto un nuovo HttpPost ActionResult

Il tasto vecchio funziona: il nuovo pulsante è solo per metà realizzato ma già posso vedere che il ActionResult UpdateJsonTrick non sta ricevendo i dati dal punto di vista corretto. La stringa returnMessage legge: "combattente Creato '' nel sistema." Prima che io possa fare qualcosa di utile in quel ActionResult, ho avuto modo di conoscere come passare i dati. Dove sto andando male?

Quindi, l'Edit.aspx è solo una semplice dichiarazione Html.EditorForModel("Fighter"), ma qui è il 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>
<% } %>

Ed ecco il (bit pertinente dal) di controllo:

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

}

Grazie per la vostra pazienza, se avete bisogno di codice o informazioni aggiuntive, posso fornire.

È stato utile?

Soluzione

C'è un bug in MVC 3 Anteprima 1 in cui il JsonValueProviderFactory non è inserito di default.

Avere qualcosa di simile nel tuo Global.asax dovrebbe aiutare:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory())
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top