在MVC3 ModelBinding - 模型动作之间通过形式后重建 - 如何坚持(ModelBi

2019-09-17 16:50发布

我有我从喜欢有用的帖子拼凑一个多步骤的向导该公司得到了一些问题,但是..这里的设置我有

[Serializable]
public class WizardModel
{

    public IList<IStepViewModel> Steps 
    { 
        get; 
        set; 
    }
    public void Initialize()
    {
        Steps = typeof(IStepViewModel)
            .Assembly
            .GetTypes()
            .Where(t => !t.IsAbstract && typeof(IStepViewModel).IsAssignableFrom(t))
            .Select(t => (IStepViewModel)Activator.CreateInstance(t))
            .ToList();
    }

}

我的向导控制器

    public ActionResult Index()
    {
        var wizard = new WizardModel();     
        wizard.Initialize();
        //this populates wizard.Steps with 3 rows of IStepViewModel
        return View(rollover);       
    }

    [HttpPost]
    public ActionResult Index(
        [Deserialize] WizardModel wizard,
        IStepViewModel step
        )
    {
        //but when this runs wizard is a new class not the one previously Initialized
         wizard.Steps[rollover.CurrentStepIndex] = step;
    }

我的问题是,向导是一个新的对象,每次贴出的 - 当我试图绕过填充阵列中的每个步骤相同的模型。 有没有人有我要去错在这里,其中的一个想法?

这里的ModelBinding

Global.asax中

   ModelBinders.Binders.Add(typeof(IStepViewModel), new FormTest.Models.StepViewModelBinder());

  public class StepViewModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var stepTypeValue = bindingContext.ValueProvider.GetValue("StepType");
        var stepType = Type.GetType((string)stepTypeValue.ConvertTo(typeof(string)), true);
        var step = Activator.CreateInstance(stepType);
        bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => step, stepType);
        return step;
    }
}

提前致谢

编辑

如果我的理解,使用会话的替代方案是序列化我的模型(如下图),并在我的控制器行动反序列化。 我设置该被张贴到控制器..当我有填充了各工序中的向导模型它获取返回到视图用于下一步骤等..直到最后的步骤中模型的值。

Index.cshtml

   @using (Html.BeginForm())
   {
         @Html.Serialize("wizard", Model);  
         etc...
   }   

所以,我尝试向导参数反序列化在这里

    [Deserialize] WizardModel wizard,

谈到通过控制器后动作是一个新的对象,每次 - 我想看看这是可能的,而无需使用会话,但@ Html.Serialize? 和Post

Answer 1:

使用会话请求之间持久对象。

Session["SuperWizard"] = wizard


Answer 2:

此代码做到底的工作。 里面的控制器动作,

        var serializer = new MvcSerializer();
        var value = Request["wizard"];
        var wizard = (WizardModel)serializer.Deserialize(value, SerializationMode.Signed);

并在视图

    @Html.Serialize("wizard", Model, SerializationMode.Signed);   


Answer 3:

模型绑定用于提交的表单值绑定到新的对象。 所以如果你想完全相同的对象,像迈克建议,您将需要使用会话或一些其他持久性存储。 但是,如果你的对象每次可以重新创建,那么你只需要投入足够的数据形式,这样,当它被贴了,一切都可以重新的数据一定会得到一个新的对象相同的值。



文章来源: ModelBinding in Mvc3 - model is recreated between actions via form post - how to persist