我正在构建的应用程序中有一个页面。该页面包含一些点点滴滴,然后是一个局部 View ,该 View 根据从下拉列表中选择的内容加载不同的 View 。下拉列表中的每个选项都有与之关联的不同 View ,并且每个 View 都有自己的字段和模型。
无论加载的是什么 View ,我都在执行相同的操作 - 我正在序列化模型并将 XML 存储在数据库中。情况总是如此,并且没有基于 View /模型的独特处理(除了字段不同这一事实)。出于序列化目的,所有模型都继承自相同的基类。
我希望能够做这样的事情:
public ActionResult SubmitPartialView<T>(T model)
{
BaseClass baseClassModel = (BaseClass)(object)model;
// serialize and save to database
}
但是 MVC 不允许这样做——“不能在 Controller 上调用操作,因为操作是一个通用方法”。
如果我尝试将 BaseClass 作为参数本身传递,它只包含基类的属性,因此不包含模型的任何属性。
除了为每个可以提交的 View 创建一个单独的操作,并让每个 View 调用一个单独的方法来处理逻辑之外,是否没有其他选择?
最佳答案
我看到这个问题有点老了,但如果它对任何人有帮助 - 我正在阅读动态模型和 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);
}
模型 Binder 是这样的;
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);
}
}
第一个
关于c# - MVC - 通用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44456585/