Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何将ASP.Net MVC路由段中的1或0映射为布尔操作方法输入参数_Asp.net Mvc_Asp.net Mvc 3_Asp.net Mvc 4_Model Binding_Value Provider - Fatal编程技术网

Asp.net mvc 如何将ASP.Net MVC路由段中的1或0映射为布尔操作方法输入参数

Asp.net mvc 如何将ASP.Net MVC路由段中的1或0映射为布尔操作方法输入参数,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,model-binding,value-provider,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Model Binding,Value Provider,我们有一些PHP和Javascript应用程序可以调用一些ASP.NETMVC端点。假设我们有一个端点: public ActionResult DoSomething(bool flag) { } 我希望它与flag的值匹配,无论我传入的是1或0的整数,还是传入的是“true”或“false”字符串。我需要实现框架的哪一部分才能与之匹配 我需要实现框架的哪一部分才能与之匹配 自定义。您可以使用自定义模型活页夹,如本问题所示 现在,如果您希望全局执行此操作,因此不必在每个可能获得0/1而不是

我们有一些PHP和Javascript应用程序可以调用一些ASP.NETMVC端点。假设我们有一个端点:

public ActionResult DoSomething(bool flag)
{

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

我需要实现框架的哪一部分才能与之匹配


自定义。

您可以使用自定义模型活页夹,如本问题所示

现在,如果您希望全局执行此操作,因此不必在每个可能获得0/1而不是true/false的bool上设置属性,那么您可以通过覆盖默认模型绑定来扩展默认模型绑定,以将0或1理解为false或true,如本so问题中所示


这两者的某种组合应该可以满足您的需要。

最好的方法是使用自定义值提供程序。虽然您可以使用一个完整的定制模型绑定器来实现这一点,但基于您的需求,这是一种过分的做法,而且实现定制值提供程序要简单得多

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

您只需创建一个自定义值提供程序来处理键为“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。在GetValue标志中,将“flag”路由数据项的值转换为int,然后转换为布尔值,具体取决于int是否大于零。对于所有其他不是“flag”的路由数据键,您只需返回null,这会告诉MVC框架忽略此值提供程序并转到其他值提供程序

要实现这一点,需要实现ValueProviderFactory的子类,该子类创建自定义IntToBoolValueProvider提供程序。此外,您还需要在MVC框架中注册此工厂。您可以在global.asax中使用静态ValueProviderFactorys类执行此操作:

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 flag输入参数将为true,当它为零时,flag参数将为false


有关MVC自定义值提供程序的更多信息,请参见。

这是一个解决方法,但如果您不想修改或创建模型绑定器,则这是最终实例中的示例

public ActionResult DoSomething(string flag)
{

      if(flag.Equals("true") || flag.Equals(1)) {
            //condition true, any else false
      }


}

您希望创建自定义管线。有两三个。添加几个要使用的示例URL。还要解释这些终点是否与标准路线有所不同。如果他们这样做(从bool开始),那会更好。