3

我有一个多步骤向导,我从像这样的有用帖子中拼凑而成,但是它有一些问题.. 这是我的设置

[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;
    }

我的问题是向导每次发布时都是一个新对象 - 当我试图通过相同的模型来填充数组中的每个步骤时。有谁知道我在这里哪里出错了?

这是模型绑定

全球.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;
    }
}

提前致谢

编辑

如果我理解,使用会话的替代方法是序列化我的模型(如下),并在我的控制器操作中反序列化。我在模型上设置了发布到控制器的值..它会返回到下一步的视图中,依此类推..直到最后一步,当我有一个填充了每个步骤的向导模型时。

索引.cshtml

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

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

    [Deserialize] WizardModel wizard,

每次通过控制器发布操作都是一个新对象 - 我想看看这是否可能不使用 Session 但@Html.Serialize?和发布

4

3 回答 3

1

这段代码最终完成了这项工作。在控制器动作内部,

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

并且在视图中

    @Html.Serialize("wizard", Model, SerializationMode.Signed);   
于 2012-06-04T13:00:14.973 回答
1

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

Session["SuperWizard"] = wizard
于 2012-06-01T13:22:25.437 回答
0

模型绑定用于将 POST 表单值绑定到新对象。因此,如果您想要完全相同的对象,就像 Mike 建议的那样,您将需要使用 Session 或其他一些持久性存储。但是,如果您的对象每次都可以重新创建,那么您只需要在表单中放入足够的数据,以便在发布时,所有内容都可以重新绑定数据以在新对象中获取相同的值。

于 2012-06-01T13:29:46.550 回答