Mar*_*arc 3 custom-model-binder c#-4.0 asp.net-mvc-3
我有来自具有不同内容的特定操作的传入请求(来自Facebook for Credits处理),因此我有不同的模型类来处理它.
这是我的行动:
public ActionResult Index([ModelBinder(typeof(FacebookCreditModelBinder))] IFacebookRequest facebookRequest)
{
if (facebookRequest is FacebookPaymentsGetItemsRequest)
{
// do whatever
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的模型活页夹.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个FacebookPaymentsGetItemsRequest对象,如果传入的var"方法"是"payments_get_items",FacebookPaymentsStatusUpdateRequestif方法是"payments_status_update",我不知道如何在bindingContext中更改模型的类型.是否可以在自定义模型绑定器中更改模型的类型?
其他方法:我也尝试使用BindModel并且我能够返回正确的对象,但是所有属性都为null,因为它没有被默认的模型绑定器填充:
public override object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
NameValueCollection form = controllerContext.HttpContext.Request.Form;
if (form.Get("method") == "payments_get_items")
{
return new FacebookPaymentsGetItemsRequest();
}
...
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
并注册Application_Start:
ModelBinders.Binders.Add(typeof(IFacebookRequest), new FacebookCreditModelBinder());
Run Code Online (Sandbox Code Playgroud)
然后您的控制器操作可能如下所示:
public ActionResult Index(IFacebookRequest facebookRequest)
{
if (facebookRequest is FacebookPaymentsGetItemsRequest)
{
// do whatever
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2024 次 |
| 最近记录: |