MVC - 通用操作

时间:2017-06-09 11:24:55

标签: c# asp.net-mvc generics

我正在构建的应用中有一个页面。该页面包含一些零碎,然后是部分视图,根据从下拉列表中选择的内容加载不同的视图。下拉列表中的每个选项都有一个与之关联的不同视图,每个视图都有自己的字段和模型。

无论视图是什么加载,我都在执行相同的操作 - 我正在序列化模型并将XML存储在数据库中。情况总是如此,并且没有基于视图/模型的唯一处理(除了字段不同的事实)。所有模型都继承自相同的基类以进行序列化。

我希望能够做到这样的事情:

public ActionResult SubmitPartialView<T>(T model)
{
   BaseClass baseClassModel = (BaseClass)(object)model;
   // serialize and save to database
}

但MVC不允许这样做 - “无法在控制器上调用操作,因为操作是一种通用方法”。

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

除了为每个可以提交的视图创建一个单独的操作,并且让每个视图调用一个处理逻辑的单独方法之外,没有其他选项吗?

1 个答案:

答案 0 :(得分:1)

我看到这个问题有点老了,但是如果它对任何人都有帮助 - 我正在用动态模型和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