gpt4 book ai didi

asp.net-mvc-3 - 我如何构建一个自定义模型绑定(bind)器,它将根据请求上下文返回不同类型的模型?

转载 作者:行者123 更新时间:2023-12-01 11:54:46 24 4
gpt4 key购买 nike

我有关于特定操作的传入请求(来自 Facebook 的积分处理),这些请求将具有不同的内容,因此我有不同的模型类来处理它。

这是我的 Action :

public ActionResult Index([ModelBinder(typeof(FacebookCreditModelBinder))] IFacebookRequest facebookRequest)
{
if (facebookRequest is FacebookPaymentsGetItemsRequest)
{
// do whatever
}
}

这是我的模型 Binder 。

public class FacebookCreditModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var binder = new DefaultModelBinder();
// how to change the model here in the bindingContext?
return binder.BindModel(controllerContext, bindingContext);
}
}

例如,如果传入的 var“method”是“payments_get_items”,我想创建一个 FacebookPaymentsGetItemsRequest 对象;如果方法是“payments_status_update”,我想创建一个 FacebookPaymentsStatusUpdateRequest,但我不知道不知道如何更改 bindingContext 中模型的类型。是否可以更改自定义模型 Binder 中的模型类型?


其他方法:我也用 BindModel 尝试过,我能够返回正确的对象,但所有属性都是空的,因为它没有被默认模型绑定(bind)器填充:

public override object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
NameValueCollection form = controllerContext.HttpContext.Request.Form;
if (form.Get("method") == "payments_get_items")
{
return new FacebookPaymentsGetItemsRequest();
}
...

最佳答案

你可以这样做:

public class FacebookCreditModelBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
var methodValue = bindingContext.ValueProvider.GetValue("method");
if (methodValue == null || string.IsNullOrEmpty(methodValue.AttemptedValue))
{
throw new Exception("The method parameter was not found");
}

var method = methodValue.AttemptedValue;
IFacebookRequest model = null;
if (method == "payments_get_items")
{
model = FacebookPaymentsGetItemsRequest();
}
else if (method == "...")
{
model = ....
}
else
{
throw new NotImplementedException("Unknown method value: " + method);
}

bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType());
return model;
}
}

并在Application_Start中注册:

ModelBinders.Binders.Add(typeof(IFacebookRequest), new FacebookCreditModelBinder());

然后您的 Controller 操作可能如下所示:

public ActionResult Index(IFacebookRequest facebookRequest)
{
if (facebookRequest is FacebookPaymentsGetItemsRequest)
{
// do whatever
}
}

关于asp.net-mvc-3 - 我如何构建一个自定义模型绑定(bind)器,它将根据请求上下文返回不同类型的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8276627/

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