Pregunta

Al mezclar y combinar tutoriales más antiguos con publicaciones recientes en MVC 3 Preview 1, me encuentro con el siguiente problema. Estoy tratando de mudarme a las ediciones impulsadas por JSON de mi Fighter Modelo (y el DB subyacente) en lugar de ediciones 'simples' sin JSON.

Tengo una vista de edición (que usa un Shared EditorTemplate, fighter.ascx) Configuración para mi Fighter clase (que existe en un modelo EF 4).

En esto tengo 2 botones. Uno 'viejo', que es un envío que llama a mi editController sin json, y uno es nuevo, para el cual he escrito un nuevo HttpPost ActionResult

El botón antiguo funciona: el nuevo botón solo está medio implementado, pero ya puedo ver que el ActionResult UpdateJsonTrick no está recibiendo los datos de la vista correctamente. los returnMessage Lecturas de cadena: "Caza creado '' en el sistema". Antes de que pueda hacer algo útil en ese ActionResult, debo saber cómo pasar esos datos. ¿Dónde me voy a equivocar?

Entonces, la edición.aspx es solo un simple Html.EditorForModel("Fighter") declaración,Pero aquí está el luchador.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>
<% } %>

Y aquí está el (bit relevante del controlador):

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

}

Gracias por su paciencia, si necesita código o información adicional, puedo suministrar.

¿Fue útil?

Solución

Hay un error en MVC 3 Vista previa 1 donde el JsonValueProviderFactory no está registrado por defecto.

Tener algo como esto en tu Global.asax debería ayudar:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory())
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top