我正在构建的应用中有一个页面。该页面包含一些零碎,然后是部分视图,根据从下拉列表中选择的内容加载不同的视图。下拉列表中的每个选项都有一个与之关联的不同视图,每个视图都有自己的字段和模型。
无论视图是什么加载,我都在执行相同的操作 - 我正在序列化模型并将XML存储在数据库中。情况总是如此,并且没有基于视图/模型的唯一处理(除了字段不同的事实)。所有模型都继承自相同的基类以进行序列化。
我希望能够做到这样的事情:
public ActionResult SubmitPartialView<T>(T model)
{
BaseClass baseClassModel = (BaseClass)(object)model;
// serialize and save to database
}
但MVC不允许这样做 - “无法在控制器上调用操作,因为操作是一种通用方法”。
如果我尝试将BaseClass作为参数本身传递,它只包含基类的属性,因此不包含模型的属性。
除了为每个可以提交的视图创建一个单独的操作,并且让每个视图调用一个处理逻辑的单独方法之外,没有其他选项吗?
答案 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