asp.net-mvc – 如何将ASP.Net MVC路径段中的1或0映射到布尔动作方法输入参数

我们有一些 PHP和 Javascript应用程序调用一些ASP.NET MVC端点.假设我们有这个端点: public ActionResult DoSomething(bool flag){} 我希望它匹配flag的值,无论我传入1或0的整数,还是传入一个“true”或“false”的字符串.我需要实现框架的哪个部分才能与之

我们有一些
PHP和
Javascript应用程序调用一些ASP.NET MVC端点.假设我们有这个端点:

public ActionResult DoSomething(bool flag)
{

}

我希望它匹配flag的值,无论我传入1或0的整数,还是传入一个“true”或“false”的字符串.我需要实现框架的哪个部分才能与之匹配?

解决方法

执行此操作的最佳方法是使用自定义值提供程序.虽然您可以使用完整的自定义模型绑定器来执行此操作,但这可能会因您的要求而过度,并且只需简单地实现自定义值提供程序即可.

有关何时使用自定义模型绑定器以及何时使用自定义值提供程序的一些指导,请参阅here和here.

您可以创建一个自定义值提供程序来处理具有“flag”键的路由值,并在值提供程序中处理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,在本例中为键“flag”.在GetValue标志中,将“flag”路由数据条目的值转换为int,然后转换为boolean,具体取决于int是否大于零.对于不是“flag”的所有其他路由数据键,您只需返回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标志输入参数将为true,而当它为零时,flag参数将为false.

有关MVC自定义价值提供商的更多信息,请访问here.

作者: dawei

【声明】:永州站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部