2017-05-16 3 views
1

Ich möchte, dass die Steuerung akzeptiert/Details/1 und/User/xxx aber nicht/User/.net MVC Aktion mit Optionale Parameter

und ich versuche, es unten wie =>

public ActionResult Details(Nullable<int> id, Nullable<string> name) 
    { 
     if (((id ?? 0) == 0) && name == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     Instructor instructor = db.Instructors.Where(x => x.InstructorId == id || x.faculty_name.Equals(name)).SingleOrDefault(); 

     if (instructor == null) 
     { 
      return HttpNotFound(); 
     } 

     ViewBag.faculty_active = MyCustomFunctions.UserActivity(); 
     return View(instructor); 
    } 

i wollen, dass (Villa oben) Benutzer passieren kann/Details/1 oder/Details/xxx aber nicht/Details/thats, warum ich hinzufügen Bedingung check =>

 if (((id ?? 0) == 0) && name == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

, aber ich will den Code der Compiler gibt mir Fehler laufen etwas wie => enter image description here i das war dachte perfekt, aber ich weiß nicht, warum ein falsch gemacht haben = Ich habe versucht =>

public ActionResult Details(int? id, string? name) 
    { 
    } 

, die die gleiche error.i gibt mir auch über dieses Problem gesucht war und ich fand => ASP.NET MVC Overriding Index action with optional parameter

Ich verstehe nichts. Deshalb habe ich diese Art von Problemen gestellt. das wird toll voll wenn mir jemand helfen kann?

+2

zu analysieren "string" ist bereits Nullable. Aber du kannst nicht 2 Nullable-Werte als Parameter haben und Routen verwenden (du wirst nur '/ Details? Name = xxx' erzeugen können - wenn du'/Details/xxx' verwenden würdest, sind beide Parameter 'null' und dein Code wird immer 'BadRequest' zurückgeben –

+0

@StephenMuecke public ActionResult Details (int id = 0, string name = null) gibt mir eine schlechte request .... gibt es eine möglichkeit, dieses problem zu lösen oder ich muss anderen struktur –

+0

folgen Habe einfach einen Parameter ('string') und überprüfe, ob es zu' int' geparst werden kann. –

Antwort

4

string ist bereits nullable so Nullable<string> null erlaubt und string? keinen Sinn machen. Sie können jedoch keine 2 NULL-Werte haben und die gewünschten Routen erreichen. Die Routing-Engine hat keine Möglichkeit zu wissen, welcher der Parameter gebunden werden soll, und wenn Sie ../Details/xxx verwenden würden, wären beide Werte null und Sie würden immer HttpStatusCode.BadRequest zurückgeben.

Sie können dies mit 2 separaten Methoden (zB DetailsByID und DetailsByName) und Routen-Definitionen erreichen. Wenn Sie jedoch eine einzelne Methode möchten, können Sie nur einen Parameter für alle 3 Routen angeben. In der Methode können Sie dann versuchen, den Wert zu int

2

Verwenden Sie nicht Nullable<string>, weil Sie nicht benötigt und macht keinen Sinn.

string akzeptiert bereits null Wert und das bedeutet, ist bereits nullable.

kurzes Beispiel:

string myString=null; 
0

Sie benötigen Nullable für Werttypen wie int, demical, Datetime usw. hinzuzufügen ,.

String ist ein Referenztyp, so dass es standardmäßig