c# - ASP.NET MVC TryValidateModel() Problemas al modificar el modelo
asp.net-mvc asp.net-mvc-2 (1)
Tengo un proceso de formulario de dos pasos en el que el primer conjunto de datos se almacena en la sesión.
[IsMp4File]
[Required(ErrorMessage = "* Please select a video to upload")]
public HttpPostedFileBase VideoClip { get; set; }
[Required(ErrorMessage = "* Please select a thumbmail image")]
public HttpPostedFileBase VideoThumbnail{ get; set; }
public string VideoFileName { get { return VideoClip.FileName; } }
public NewsWizardStep CurrentStep { get; set; }
...
public enum NewsWizardStep : int
{
One = 1,
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6
}
Controlador
public ActionResult TvCreate(TvNewsVideoVM modelVM)
{
if (modelVM.CurrentStep == NewsWizardStep.Two)
{
var sessionModel = ((TvNewsVideoVM)Session["TvModelVM"]);
modelVM.VideoClip = sessionModel.VideoClip;
modelVM.VideoThumbnail = sessionModel.VideoThumbnail;
}
if (TryValidateModel(modelVM))
{
...
}
}
TryValidateModel(modelVM)
devuelve falso, diciendo que se requieren VideoClip y VideoThumnail, a pesar de mapearlos desde seesionModel a viewModel. He añadido un punto de interrupción y comprobado que no son nulos.
Parece que hay alguna funcionalidad subyacente que no conozco sobre cómo funcionan ModelState y ValidateModel (), pero no sé qué.
ACTUALIZAR
No diría que resolví el problema, pero descubrí una solución que no es tan bonita. Al entrar en ModelState es posible configurar ModelValue usando SetModelValue()
luego eliminar manualmente el error del estado del modelo y luego llamar. TryValidateModel()
: es posible que ni siquiera tenga que agregar los valores, solo elimine el error que no he intentado. Aquí está mi trabajo alrededor.
if (modelVM.CurrentStep == NewsWizardStep.Two)
{
var sessionModel = ((MtTvNewsVideoVM)Session["MtTvModelVM"]);
modelVM.VideoClip = sessionModel.VideoClip;
modelVM.VideoThumbnail = sessionModel.VideoThumbnail;
ModelState.SetModelValue("VideoClip", new ValueProviderResult(sessionModel.VideoThumbnail, sessionModel.VideoFileName, CultureInfo.CurrentCulture));
ModelState.SetModelValue("VideoThumbnail", new ValueProviderResult(sessionModel.VideoClip, sessionModel.VideoFileName, CultureInfo.CurrentCulture));
ModelState["VideoClip"].Errors.RemoveAt(0);
ModelState["VideoThumbnail"].Errors.RemoveAt(0);
}
Durante el enlace del modelo, DefaultModelBinder
valida sus parámetros de acción. Entonces, cuando la ejecución public ActionResult TvCreate(TvNewsVideoVM modelVM)
su public ActionResult TvCreate(TvNewsVideoVM modelVM)
, ModelState
ya contiene los errores de validación.
Cuando llama a TryValidateModel
, no borra el ModelState
por lo que los errores de validación permanecen allí, por eso devuelve falso. Por lo tanto, debe borrar la colección ModelState
si desea rehacer la validación posteriormente de forma manual:
public ActionResult TvCreate(TvNewsVideoVM modelVM)
{
ModelState.Clear();
if (modelVM.CurrentStep == NewsWizardStep.Two)
{
var sessionModel = ((TvNewsVideoVM)Session["TvModelVM"]);
modelVM.VideoClip = sessionModel.VideoClip;
modelVM.VideoThumbnail = sessionModel.VideoThumbnail;
}
if (TryValidateModel(modelVM))
{
...
}
}