Vista parcial HttpPost invocado en lugar de HttpGet

Estoy trabajando en la parte de administración de una aplicación web MVC. Tuve la idea de usar "widgets" para un solo panel de administración. Explicaré mis intenciones primero.

Tengo una tabla de idiomas, y para eso me gustaría crear una vista parcial con una lista desplegable para esos idiomas y un solo botón "Editar", que llevaría al usuario a una vista no parcial para editar el idioma. Después de hacer clic en Guardar, los usuarios serían redirigidos a la vista de Índice, que mostraría la lista desplegable nuevamente.

Así que tengo un "Index.cshmtl" y un "EditLanguage.cshtml" como vistas no parciales y un "LanguageWidget.cshtml" como una vista parcial.

Primero, el usuario ve la vista de índice.

    public ViewResult Index()
    {
        return View();
    }

Esta vista tiene el siguiente código:

@using CodeBox.Domain.Concrete.ORM
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Administration</h2>
@Html.Action("LanguageWidget")

La vista parcial "LanguageWidget" solo contiene el siguiente código, y cuando el usuario lo envía, lo publica en el método anotado HttpPost en mi controlador:

@using (Html.BeginForm("LanguageWidget", "Admin"))
{
    @Html.DropDownListFor(model => model.SelectedItem, Model.Languages)
    <input type="submit" value="Edit"/>
}

Este es el método HttpPost para el widget: [HttpPost] public ActionResult LanguageWidget(LanguageWidgetModel model) { var lang = langRepo.Languages.FirstOrDefault(l => l.LanguageId == model.SelectedItem); return Ver("EditarIdioma", lang); }

Esto lleva al usuario a la página de edición de idioma, que funciona bien.

¡Pero entonces! El usuario edita el idioma y envía la página, que invoca el método HttpPost "EditLanguage", por lo que el idioma se guarda correctamente.

    [HttpPost]
    public ViewResult EditLanguage(Language model)
    {
        if (ModelState.IsValid)
        {
            langRepo.SaveLanguage(model);
            TempData["message"] = string.Format("{0} has been saved!", model.Name);
            return View("Index");
        }
        else
        {
            return View(model);
        }
    }

Entonces, cuando devuelvo la vista "Índice", lo que parece lógico, supongo, el controlador aún asume que se trata de una solicitud HttpPost, y cuando muestra la vista Índice, invoca el método "LanguageWidget", asumiendo que tiene que representar el HttpPost método.

Esto lleva al método LanguageWidget HttpPost, que devuelve una vista completa con diseño, devolviendo solo eso, así que tengo mi diseño, con vista, que contiene un diseño, con la vista de edición.

Realmente no veo cómo podría arreglar esto?

Estoy bastante seguro de que es un defecto de diseño de mi parte, pero no puedo resolverlo.

¡¡Gracias por adelantado!!

preguntado el 31 de julio de 12 a las 15:07

1 Respuestas

Considere usar:

return RedirectToAction("Index")

en lugar de:

return View("Index");

Puede parecer más lógico si el usuario es realmente redirigido a Index en lugar de permanecer en el EditLanguage. Y si el usuario presiona el botón Actualizar, no se volverán a enviar datos con este enfoque.

Respondido 31 Jul 12, 15:07

¡Sí! ¡Eso funcionó! ¡Es bastante lógico! :), ¡También usé redirecttoaction en mi acción de publicación de LanguageWidget! ¡Gracias! - Cristóbal de Troyer

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.