6

У нас есть несколько приложений PHP и Javascript, которые вызывают некоторые конечные точки ASP.NET MVC. Скажем, у нас есть эта конечная точка:Как сопоставить 1 или 0 в сегменте маршрута ASP.Net MVC в входном параметре метода логического действия

public ActionResult DoSomething(bool flag) 
{ 

} 

Я хочу, чтобы соответствовать значению для флага передать ли я в целое число 1 или 0, или передать в строке «истина» или «ложь». Какую часть структуры мне нужно реализовать, чтобы соответствовать этому?

+0

вы хотите создать собственные маршруты. 2 или 3 из них. Добавьте несколько примеров URL-адресов для работы. Также объясните, будут ли эти конечные точки вообще отличаться от ваших стандартных маршрутов. Если они сделают (начнут с чего-то вроде bool), это будет лучше. –

ответ

0

Какую часть рамки мне нужно реализовать, чтобы соответствовать этому?

A изготовленный под заказ model binder.

+0

, что бы это сделать –

0

Вы можете использовать пользовательские модели вяжущее, как найти в этом SO вопрос ASP.NET MVC controller actions with custom parameter conversion?

Теперь, если вы хотите сделать это во всем мире, так что вы не должны установить атрибут на каждом BOOL, который мог бы получить 0/1 вместо true/false, то вы можете расширить привязку модели по умолчанию, чтобы понимать 0 или 1 как ложные или истинные, переопределяя связующее устройство по умолчанию, как указано в этом вопросе SO Change the default model binder in asp.net MVC

Некоторая комбинация этих двух должна помочь вам что ты хочешь.

7

Наилучший способ сделать это - использовать пользовательский поставщик значений. В то время как вы можете сделать это, используя полное настраиваемое связующее устройство, это перебор, основанный на ваших требованиях, и намного проще реализовать собственный поставщик стоимости.

Для получения дополнительной информации о том, когда вы используете специализированное связующее устройство и когда использовать пользовательский поставщик значений, см. here и here.

Вы можете просто создать поставщика настраиваемых значений для обработки значений маршрута, имеющих ключ «флаг», и обработать 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 возвращать верно для ключей значений маршрута вы заинтересованы в этом случае ключа «флаг». В флаге GetValue вы преобразовываете значение записи данных маршрута «флаг» в int, а затем в логическое, в зависимости от того, является ли int больше нуля. Для всех других ключей данных маршрута, которые не являются «флагом», вы просто возвращаете значение null, которое сообщает инфраструктуре MVC игнорировать этот ValueProvider и перейти к другим поставщикам стоимости.

Чтобы подключить это устройство, вам необходимо реализовать подкласс ValueProviderFactory, который создает пользовательский поставщик IntToBoolValueProvider. Кроме того, вам необходимо зарегистрировать эту фабрику с картой MVC. Вы делаете это в глобальном масштабе.asax используя статический ValueProviderFactories класс:

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, а когда он равен нулю, параметр флага будет false.

Дополнительную информацию о поставщиках услуг MVC можно найти here.

+0

Использование пользовательского поставщика стоимости является корректным способом, ответ будет отмечен как принятый. –