我们有一些调用一些 ASP.NET MVC 端点的 PHP 和 Javascript 应用程序。假设我们有这个端点:
public ActionResult DoSomething(bool flag)
{
}
我希望它与 flag 的值匹配,无论我传入整数 1 还是 0,还是传入字符串“true”或“false”。为了匹配它,我需要实现框架的哪一部分?
我们有一些调用一些 ASP.NET MVC 端点的 PHP 和 Javascript 应用程序。假设我们有这个端点:
public ActionResult DoSomething(bool flag)
{
}
我希望它与 flag 的值匹配,无论我传入整数 1 还是 0,还是传入字符串“true”或“false”。为了匹配它,我需要实现框架的哪一部分?
最好的方法是使用自定义值提供程序。虽然您可以使用完整的自定义模型绑定器来执行此操作,但根据您的要求,这太过分了,而且简单地实现自定义值提供程序要容易得多。
有关何时使用自定义模型绑定器以及何时使用自定义值提供程序的一些指导,请参阅此处和此处。
您可以创建一个自定义值提供程序来处理具有“标志”键的路由值,并在值提供程序中处理 int 到 bool 的转换。执行此操作的代码如下所示:
public class IntToBoolValueProvider : IValueProvider
{
public IntToBoolValueProvider(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
this._context = context;
}
public bool ContainsPrefix(string prefix)
{
return prefix.ToLower().IndexOf("flag") > -1;
}
public ValueProviderResult GetValue(string key)
{
if (ContainsPrefix(key))
{
int value = 0;
int.TryParse(_context.RouteData.Values[key].ToString(), out value);
bool result = value > 0;
return new ValueProviderResult(result, result.ToString(), CultureInfo.InvariantCulture);
}
else
{
return null;
}
}
ControllerContext _context;
}
public class IntToBoolValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
return new IntToBoolValueProvider(controllerContext);
}
}
在值提供者中,您实现 ContainsPrefix 方法以对您感兴趣的路由值键(在本例中为键“标志”)返回 true。在 GetValue 标志中,您将“标志”路由数据条目的值转换为 int,然后转换为布尔值,具体取决于 int 是否大于零。对于所有其他不是“标志”的路由数据键,您只需返回 null,这会告诉 MVC 框架忽略此 ValueProvider 并继续使用其他值提供程序。
要将其连接起来,您需要实现 ValueProviderFactory 的子类,该子类创建自定义 IntToBoolValueProvider 提供程序。此外,您需要使用 MVC 框架注册此工厂。您可以使用静态 ValueProviderFactories 类在 global.asax 中执行此操作:
protected void Application_Start()
{
ValueProviderFactories.Factories.Insert(0, new IntToBoolValueProviderFactory());
}
如果您的路线设置如下:
routes.MapRoute("", "{controller}/foo/{flag}", new { action = "Foo" });
这条路线会将请求定向到
http://localhost:60286/Home/Foo/{flag}
到动作方法
public ActionResult Foo(bool flag)
{
//Implement action method
return View("Index");
}
{flag}段大于0时,bool标志输入参数为真,为零时,标志参数为假。
可以在此处找到有关 MVC 自定义值提供程序的更多信息。
您可以使用自定义模型绑定器,如此 SO 问题ASP.NET MVC controller actions with custom parameter conversion?
现在,如果您想在全局范围内执行此操作,因此您不必在每个可能获得 0/1 而不是 true/false 的布尔值上设置属性,那么您可以扩展默认模型绑定器以将 0 或 1 理解为 false 或通过覆盖默认模型绑定器为真,如在此 SO 问题中找到的Change the default model binder in asp.net MVC
这两者的某种组合应该可以满足您的需求。
为了匹配它,我需要实现框架的哪一部分?
自定义模型绑定器。
这是一种解决方法,但如果您不想修改或创建模型活页夹,它是最终实例中的示例。
public ActionResult DoSomething(string flag)
{
if(flag.Equals("true") || flag.Equals(1)) {
//condition true, any else false
}
}