En caso de que esto es útil para cualquier persona que solía solución recomendada @bob @ s utilizando PRG:
tema, véase 13 ->link.
tuve la emisión adicional de los mensajes que se pasa en el VeiwBag a la vista que se escriben y se comprueba/carga manual de TempData en las acciones del controlador cuando se hace una RedirectToAction("Action")
. En un intento de simplificar (y también hacer que se pueda mantener) extendí ligeramente este enfoque para verificar y almacenar/cargar otros datos también.Mis métodos de acción parecían algo así como:
[AcceptVerbs(HttpVerbs.Post)]
[ExportModelStateToTempData]
public ActionResult ChangePassword(ProfileViewModel pVM) {
bool result = MyChangePasswordCode(pVM.ChangePasswordViewModel);
if (result) {
ViewBag.Message = "Password change success";
else {
ModelState.AddModelError("ChangePassword", "Some password error");
}
return RedirectToAction("Index");
}
Y mi Índice de Acción:
[ImportModelStateFromTempData]
public ActionResult Index() {
ProfileViewModel pVM = new ProfileViewModel { //setup }
return View(pVM);
}
El código en la acción Filtros:
// Following best practices as listed here for storing/restoring model data:
// http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg
public abstract class ModelStateTempDataTransfer : ActionFilterAttribute {
protected static readonly string Key = typeof(ModelStateTempDataTransfer).FullName;
}
:
public class ExportModelStateToTempData : ModelStateTempDataTransfer {
public override void OnActionExecuted(ActionExecutedContext filterContext) {
//Only export when ModelState is not valid
if (!filterContext.Controller.ViewData.ModelState.IsValid) {
//Export if we are redirecting
if ((filterContext.Result is RedirectResult) || (filterContext.Result is RedirectToRouteResult)) {
filterContext.Controller.TempData[Key] = filterContext.Controller.ViewData.ModelState;
}
}
// Added to pull message from ViewBag
if (!string.IsNullOrEmpty(filterContext.Controller.ViewBag.Message)) {
filterContext.Controller.TempData["Message"] = filterContext.Controller.ViewBag.Message;
}
base.OnActionExecuted(filterContext);
}
}
:
public class ImportModelStateFromTempData : ModelStateTempDataTransfer {
public override void OnActionExecuted(ActionExecutedContext filterContext) {
ModelStateDictionary modelState = filterContext.Controller.TempData[Key] as ModelStateDictionary;
if (modelState != null) {
//Only Import if we are viewing
if (filterContext.Result is ViewResult) {
filterContext.Controller.ViewData.ModelState.Merge(modelState);
} else {
//Otherwise remove it.
filterContext.Controller.TempData.Remove(Key);
}
}
// Restore Viewbag message
if (!string.IsNullOrEmpty((string)filterContext.Controller.TempData["Message"])) {
filterContext.Controller.ViewBag.Message = filterContext.Controller.TempData["Message"];
}
base.OnActionExecuted(filterContext);
}
}
realizo mis cambios aquí son una extensión bastante obvio de lo que ya se está haciendo con el ModelState por el código @ el enlace proporcionado por @bob - pero tenía que tropezar en este hilo antes de que yo pensaba de la manipulación de esta manera.
ViewData.ModelState no tiene un setter. –
bien. copiar en lugar de establecer no tuvo acceso a VS para verificarlo desde su casa. – tvanfosson
, necesitará verificar la sintaxis de la función de copiado; nuevamente, no hay VS en casa. – tvanfosson