我的模型中有以下内容:
public sealed class OAuthProvider
{
private readonly string name;
private const string SOME_PROVIDER = "SOMEPROVIDER";
public static readonly OAuthProvider SomeProvider = new OAuthProvider(SOME_PROVIDER);
private OAuthProvider(String name) { this.name = name; }
public override String ToString(){ return name; }
public static implicit operator string(OAuthProvider oAuthProvider)
{
return oAuthProvider.name;
}
public static implicit operator OAuthProvider(string oAuthProvider)
{
switch (oAuthProvider)
{
case SOME_PROVIDER : return SomeProvider ;
default: return null;
}
}
}
这在我的OAuth
控制器中:
public ActionResult Profile(OAuthProvider network)
{...}
这在我看来:
@model SomeModel
Html.RenderAction("Profile", "OAuth", new { network = Model.Network });
Model.Network
是string
当渲染此视图时,我可以看到(通过断点)Model.Network
作为非{null的string
进入。我的Profile(OAuthProvider)
被调用,但network
以null
进入,尽管隐式类型转换已到位。
我是以错误的方式来做这件事的吗?我被迫做一个明确的演员吗?
答案 0 :(得分:1)
不确定这是否可行,它不是你所拥有的直接答案(但在类似的情况下很难说没有调试)但可能有所帮助(并且评论的文字很多)......
在类似的情况下,当绑定不能按预期工作时,通常有助于调试 - 以及通过制作自定义绑定器。
在Application_Start
你做了类似的事情......
ModelBinders.Binders.Add(typeof(YourNamespace.OAuthProvider), new YourNamespace.Binders.OAuthProviderClassBinder());
(如果控制器永远不会到达操作或其他情况,例如ControllerBuilder.Current.SetControllerFactory(new RedirectControllerFactory());
工厂派生自DefaultControllerFactory
,类似于下面的例子,你也可以这样做)
...然后在代码中的某个地方定义像这样的绑定器,简化......
public class OAuthProviderClassBinder : DefaultModelBinder
{
//public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
//{
//}
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
var model = (OAuthProvider)base.CreateModel(controllerContext, bindingContext, modelType);
// ...you change, inspect set etc.
return model;
}
}
...这是自定义绑定的方式,调整你的'传递'值 - 也检查它们是否有问题等。
你可能最好覆盖其他方法,例如BindModel
这是一个快速链接...
Creating a custom model binder
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultmodelbinder.aspx