MVC - 通用操作

5
我正在构建一个应用程序,其中有一个页面。该页面包含一些小部件,然后是一个部分视图,根据从下拉列表中选择的内容加载不同的视图。每个下拉列表选项都与不同的视图相关联,并且每个视图都有自己的字段和模型。
无论加载的视图如何,我都执行相同的操作-序列化模型并将XML存储在数据库中。这始终是这种情况,没有基于视图/模型的独特处理(除了字段不同之外)。所有模型都继承自相同的基类以进行序列化。
我想能够做到:
public ActionResult SubmitPartialView<T>(T model)
{
   BaseClass baseClassModel = (BaseClass)(object)model;
   // serialize and save to database
}

但MVC不允许这样做 - "因为该操作是一个通用方法,所以无法在控制器上调用操作"。

如果我尝试将BaseClass本身作为参数传递,它只包含基类的属性,因此没有模型的任何属性。

除了创建单独的操作来处理每个可以提交的视图并使每个操作调用处理逻辑的单独方法之外,难道没有其他选择吗?


1
创建一个包含所有模型的类(ModelsContainer),然后只接收没有泛型的模型容器。可能还有帮助 https://dev59.com/fXnZa4cB1Zd3GeqPmzHk - Vladimir
你能展示一下调用那个方法的代码片段吗? - Adam Benson
或者简单地不使用DefaultModelBinder,在Action中绑定请求。 - Christian Gollhardt
1个回答

3
我看到这个问题有点老了,但如果有人需要帮助 - 我正在进行一些关于动态模型和MVC的阅读,看到这个问题,这让我想到一种可能的解决方案。不确定为什么你想要动态模型。但是MVC的好处是,你可以!所以;
    [HttpPost]
    public ActionResult SubmitPartial([DynamicModelBinder] dynamic model)
    {
        // Our model.ToString() serialises it from the baseModel class
       var serialisedString = model.ToString();
        // do something .. echo it back for demo
       return Content(serialisedString);
    }

而模型绑定器类似于这样:

public class DynamicModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var currentModel = controllerContext.HttpContext.Request.Form["CurrentModel"];
        if (currentModel == "CompanyModel")
        {
            Type customModel = typeof(CompanyModel);
            bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, customModel);
        }

        if (currentModel == "UserModel")
        {
            Type customModel = typeof(UserModel);
            bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, customModel);
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

hth


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接