6

Mamy kilka aplikacji PHP i Javascript, które wywołują niektóre punkty końcowe ASP.NET MVC. Powiedzmy, że mamy ten punkt końcowy:Jak odwzorować 1 lub 0 w segmencie trasy ASP.Net MVC na Boolowski parametr wejściowy metody działania

public ActionResult DoSomething(bool flag) 
{ 

} 

chcę, aby dopasować wartości dla flaga czy mijam na liczbę całkowitą 1 lub 0, lub przejść w ciąg „true” lub „false”. Jaką część struktury muszę wdrożyć, aby to osiągnąć?

+0

chcesz utworzyć niestandardowe trasy. 2 lub 3 z nich. Dodaj kilka przykładowych adresów URL do pracy. Wyjaśnij także, czy te punkty końcowe różnią się w ogóle od standardowych tras. Jeśli tak (zaczynają się od czegoś podobnego do bool), to będzie lepiej. –

Odpowiedz

0

Jaką część ram muszę wdrożyć, aby się z tym pogodzić?

Niestandardowy model binder.

+0

Który to zrobiłby –

0

Można użyć spinacza modelu niestandardowych, jak znaleźć w tym SO pytanie ASP.NET MVC controller actions with custom parameter conversion?

Teraz, jeśli chcesz to zrobić globalnie, dzięki czemu nie trzeba ustawić atrybut na każdym bool, że może dostać 0/1 zamiast wartości true/false, możesz rozszerzyć domyślny segregator modelu, aby zrozumieć 0 lub 1 jako fałszywe lub prawdziwe, przesłoniwszy domyślny segregator modelu, tak jak w tym pytaniu dotyczącym SO Change the default model binder in asp.net MVC

Niektóre kombinacje tych dwóch powinny Ci pomóc czego chcesz.

7

Najlepszym sposobem na to jest użycie dostawcy wartości niestandardowej. Możesz to zrobić za pomocą kompletnego niestandardowego segregatora, który jest przesadą w zależności od Twoich wymagań, a wprowadzenie dostawcy wartości niestandardowej jest o wiele łatwiejsze.

Aby uzyskać wskazówki dotyczące korzystania z niestandardowego segregatora i kiedy używać dostawcy wartości niestandardowej, zobacz here i here.

Można po prostu utworzyć dostawcę wartości niestandardowych, aby obsłużyć wartości tras z kluczem "flaga" i obsłużyć konwersję int do wartości bool w dostawcy wartości. Kod na to wygląda mniej więcej tak:

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); 
    } 
} 

W dostawcy wartości, można zaimplementować metodę ContainsPrefix wrócić prawdziwe dla kluczy wartości trasy, którą są zainteresowani, w tym przypadku kluczem „flaga”. W znaczniku GetValue konwertuje się wartość wpisu danych trasy "flaga" na int, a następnie na wartość logiczną, w zależności od tego, czy int jest większe od zera. Dla wszystkich innych kluczy danych trasy, które nie są "flagą", po prostu zwracasz wartość null, która nakazuje ramie MVC zignorowanie tego dostawcy wartości i przejście do innych dostawców wartości.

Aby to połączyć, należy zaimplementować podklasę ValueProviderFactory, która tworzy niestandardowego dostawcę IntToBoolValueProvider. Ponadto musisz zarejestrować tę fabrykę w środowisku MVC. Robisz to w skali globalnej.asax pomocą statycznych klasy ValueProviderFactories:

protected void Application_Start() 
{ 
    ValueProviderFactories.Factories.Insert(0, new IntToBoolValueProviderFactory()); 
} 

Jeśli wtedy trasa skonfigurować w następujący sposób:

routes.MapRoute("", "{controller}/foo/{flag}", new { action = "Foo" }); 

trasa ta będzie kierować prośby do

http://localhost:60286/Home/Foo/{flag} 

metody działania

public ActionResult Foo(bool flag) 
    { 
     //Implement action method 
     return View("Index"); 
    } 

Kiedy {flag} segment jest większy niż 0, parametr wejściowy flagi boolowej będzie prawdziwy, a gdy wynosi zero, parametr flagi będzie fałszywy.

Więcej informacji na temat dostawców wartości niestandardowej MVC można znaleźć pod adresem here.

+0

Korzystanie z dostawcy wartości niestandardowej jest sposobem corret, odpowiedź shoud być oznaczone jako zaakceptowane. –

Powiązane problemy