gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:08:33 24 4
gpt4 key购买 nike

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

这是我的 Controller Action :

[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 模型,所以对每种类型采取不同的操作是不可能的。

最佳答案

您需要编写一个自定义模型 Binder 才能使其工作:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com