2013-06-12 46 views
0

我有一个页面在http://localhost/Some,当我张贴URL更改为http://localhost/Some/Method。如何保留原始网址ModelStateViewModel更改路线显示在帖子上

这里是我当前的代码:

[HttpPost] 
public ActionResult Method(SomeMethodViewModel model) 
{ 
    if(HasError(model)) 
    { 
     var viewModel = GetViewModel(); 
     viewModel.SomeMethod = model; 
     return View("Index", viewModel); 
    } 

    return RedirectToAction("Index"); 
} 
+0

的可能重复(HTTP://计算器。 com/questions/658747/how-do-i-maintain-modelstate-errors-when-using-redirecttoaction) –

+0

对于不同的问题,这是相同的解决方案。 – Romoku

回答

0

How do I maintain ModelState errors when using RedirectToAction?

TempData可用于保存ModelStateViewModel数据。

public class SomeController : Controller 
{ 
    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var modelState = TempData["ModelState"]; 
     if (modelState != null && !ModelState.Equals(modelState)) 
     { 
      ModelState.Merge((ModelStateDictionary)modelState); 
     } 

     base.OnActionExecuted(filterContext); 
    } 

    private void SetModelState(ModelStateDictionary modelState) 
    { 
     TempData["ModelState"] = modelState; 
    } 

    private void SetViewModel(SqlAdminViewModel viewModel) 
    { 
     TempData["ViewModel"] = viewModel; 
    } 

    private SomeViewModel GetViewModel() 
    { 
     var viewModelTempData = TempData["ViewModel"]; 

     var viewModel = viewModelTempData != null 
          ? (SomeViewModel) TempData["ViewModel"] 
          : BuildSomeViewModel(); 

     return viewModel; 
    } 

    public ActionResult Index() 
    { 
     var viewModel = GetViewModel(); 

     return View(viewModel); 
    } 

    [HttpPost] 
    public ActionResult Method(SomeMethodViewModel model) 
    { 
     if(HasError(model)) 
     { 
      var viewModel = GetViewModel(); 
      viewModel.SomeMethod = model; 

      SetViewModel(viewModel); 

      return RedirectToAction("Index"); 
     } 

     return RedirectToAction("Index"); 
    } 

    privare bool HasError(SomeMethodViewModel model) 
    { 
     var hasError = false; 

     // Model validation logic 

     if(hasError) 
     { 
      SetModelState(ModelState); 
     } 

     return hasError; 
    } 
} 

这可以进一步分离:

public interface IViewModelValidator<in TViewModel> 
{ 
    bool HasError(TViewModel viewModel, ModelStateDictionary modelState); 
    bool HasError(TViewModel viewModel, ModelStateDictionary modelState, Action<ModelStateDictionary> callBack); 
} 

public abstract class ViewModelValidatorBase<TViewModel> : IViewModelValidator<TViewModel> 
{ 
    public abstract bool HasError(TViewModel viewModel, ModelStateDictionary modelState); 

    public virtual bool HasError(TViewModel viewModel, ModelStateDictionary modelState, Action<ModelStateDictionary> callBack) 
    { 
     var hasError = HasError(viewModel, modelState); 

     if (hasError && callBack != null) 
     { 
      callBack(modelState); 
     } 

     return hasError; 
    } 
} 

用法:?使用RedirectToAction时如何维护的ModelState错误]

[HttpPost] 
public ActionResult Method(SomeMethodViewModel model) 
{ 
    if(_someMethodViewModelValidator.HasError(model, ModelState, SetModelState)) 
    { 
     var viewModel = GetViewModel(); 
     viewModel.SomeMethod = model; 

     return RedirectToAction("Index"); 
    } 

    return RedirectToAction("Index"); 
}