2011-10-21 8 views
9

Próbuję przekazać zmienną łańcuchową wewnątrz asp.net MVC. Używam punktów przerwania, więc widzę, że trafiają one do poprawnej metody w kontrolerze, ale opublikowane zmienne są równe zeru.Przekazywanie zmiennych za pomocą POST w ASP.NET MVC

Moja markup:

@{ 
    ViewBag.Title = "TestForm"; 
} 

<h2>TestForm</h2> 

@using (Html.BeginForm()) { 
    <input type="text" id="testinput" /> 

    <input type="submit" value="TestForm" /> 
} 

Mój kontroler:

public ActionResult TestForm() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult TestForm(string testinput) 
{ 
    Response.Write("[" + testinput + "]"); 

    return View(); 
} 

umieścić punkt przerwania wewnątrz drugiej metodzie TestForm i testinput jest null .... Am I czegoś brakuje?

Uwaga: zdaję sobie sprawę, że przez większość czasu będę używać modelu do przekazywania danych, ale chciałbym wiedzieć, że mogę również przekazywać ciągi znaków.

W ramach tego samego pytania, w jaki sposób przekazać kilka zmiennych? Czy metoda w moim kontrolerze wygląda następująco:

[HttpPost] 
public ActionResult TestForm(string var1, var2) 
{ 
} 

Odpowiedz

18

Wygląda na to, że ustawiam id nie nazwę. Używam MVC3 każdego dnia, więc nie odtwarzam twojej próbki. (Nie śpię przez 20 godzin programowania;) ale nadal motywuję, aby pomóc) Proszę powiedz mi, czy to nie działa. Ale dla mnie wygląda na to, że musisz ustawić właściwość "name" ... a nie właściwość id. Spróbuj ... czekam teraz, aby ci pomóc, jeśli to nie zadziała.

 <input type="text" id="testinput" name="testinput" /> 
+0

Tak to działało hmmmm!. dlaczego MS zdecydowało się polegać na nazwisku, a nie ID? dlaczego zawsze robią to od tyłu? Ale dzięki! – sarsnake

+6

Nie, Microsoft naprawdę świetnie radzi sobie z mvc, nie myśl o tym na temat Microsoftu. To jest o standardach internetowych. Zasadniczo właściwość id służy do zastosowania javascript (getElementsById, CSS-StyleSheets, jQuery i innych). Właściwość name odnosi się do postów i rzeczy asynchronicznych (opartych na danych). – dknaack

+0

W zwykłej formie html nigdy nie musiałem określać właściwości name, identyfikator zawsze był wystarczający i zmienne zostały pomyślnie przesłane. – sarsnake

1

na nieco odrębnej notatce nie ma nic złego w zmiennych mijających jak jesteś, ale bardziej wydajny sposób byłoby przejść wokół silnie typami modelu widoku co pozwala skorzystać z wielu aspektów dobroci MVC za:

  • silnie wpisany widoki
  • MVC modelu wiązania
  • Html pomocnicy

Tworzenie nowego widoku modelu:

public class TestModel 
{ 
    public string TestInput { get; set; } 
} 

kontroler badawczej:

[HttpGet] 
    public ActionResult TestForm() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult TestForm(FormCollection collection) 
    { 
     var model = new TestModel(); 
     TryUpdateModel(model, collection); 

     Response.Write("[" + model.TestInput + "]"); 

     return View(); 
    } 

Państwa zdanie:

@model <yourproject>.Models.TestModel 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <title>TestForm</title> 
</head> 
<body> 
    <div> 
     @using(Html.BeginForm()) 
     { 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.TestInput) 
      </div> 
      <div class="editor-label"> 
       @Html.TextBoxFor(m => m.TestInput) 
      </div> 
      <input type="submit" value="Test Form"/> 
     } 
    </div> 
</body> 
</html> 
+1

Jeśli mówisz o silnie typowanych widokach, dlaczego polegasz na formCollection w swojej metodzie akcji POST. Czy nie powinien być publiczny ActionResult TestForm (model TestModel)? – Tommy

+0

Przepuszczam FormCollection w ten sposób do celów testowania jednostkowego bez mocks. Mój test może przekazać kolekcję formularzy do wywołania UpdateModel i zmapować je na obiekcie modelu TestModel. – Jesse