c# - 创建未知类型对象的实例并 TryUpdateModel

标签 c# asp.net-mvc

我正在使用 MVC,我有一个 Controller 操作来处理几个不同的 View 模型,每个 View 模型都有验证,我希望 Controller 检查验证。

这是我的 Controller 操作:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult WizardCaseResult(FormCollection fc)
{
    ViewA vm = new ViewA();
    TryUpdateModel<ViewA>(vm);
}

我如何更改此代码,以便可以动态设置 View 模型的类型,如下所示:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult WizardCaseResult(FormCollection fc, string ViewType)
{
    ViewType vm = new ViewType();
    TryUpdateModel<ViewType>(vm);
}

我可能会有许多不同的 View 模型,因此每种类型的不同操作实际上是不可能的。

最佳答案

您需要编写一个自定义模型绑定(bind)器才能使其工作:

public class MyModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var typeValue = bindingContext.ValueProvider.GetValue("viewType");
        var type = Type.GetType(
            (string)typeValue.ConvertTo(typeof(string)), 
            true
        );
        var model = Activator.CreateInstance(type);
        bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
        return model;
    }
}

然后:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult WizardCaseResult([ModelBinder(typeof(MyModelBinder))]object model)
{
    ...
}

现在您所要做的就是确保表单发送 ViewType 参数,该参数将指向您要实例化的 View 模型。

哦,在处理仅在运行时已知的类型时,您可以忘记强类型,例如以下内容:

ViewType vm = new ViewType();
TryUpdateModel<ViewType>(vm);

您可能还会找到following answer有帮助。

关于c# - 创建未知类型对象的实例并 TryUpdateModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605930/

相关文章:

c# - X509Certificate - key 集不存在

c# - 将嵌套的 JSON 转换为 CSV

c# - 反序列化 JSON 字符串嵌套字典

c# - 当 url 没有以 "/"结尾时,如何使用 HttpListener?

asp.net-mvc - Asp.Net MVC 4 应用程序中的 Signalr

asp.net-mvc - 与 Ninject 自绑定(bind)成员(member)提供商

asp.net-mvc - 无法将子网格绑定(bind)到剑道层次结构 UI 网格中的第二行

c# - 乘除固定比例小数的最有效方法

asp.net-mvc - 从 ASP.NET MVC2 升级到 MVC3 的原因

javascript - Microsoft.Owin.Security.Facebook 与 Facebook SDK for Javascript