2009-01-21 5 views
6

Chciałbym dynamicznie dodawać pola do formularza MVC ASP.NET z JQuery.ASP.NET MVC i JQuery Dynamic Form Content

Przykład:

<script language="javascript" type="text/javascript"> 
    var widgets; 

    $(document).ready(function() { 
     widgets = 0; 
     AddWidget(); 
    }); 

    function AddWidget() { 
     $('#widgets').append("<li><input type='text' name='widget" + widgets + "'/></li>"); 
     widgets++; 
    } 
</script> 

<ul id="widgets"> 
</ul> 

To działa, ale ja jechałem ręcznie iteracji wartości formularza w sterowniku:

[AcceptVerbs("Post")] 
public ActionResult AddWidget(FormCollection form) 
{ 
    foreach (string s in form) 
    { 
     string t = form[s]; 
    } 

    return RedirectToAction("ActionName"); 
} 

Ale przyszło mi do głowy, kiedy wysłać użytkownikowi powrót do Uzyskaj działanie w kontrolerze Będę musiał ustawić dane formularza z wprowadzonymi wartościami, a następnie iteracyjnie dodać widżety za pomocą <% skryptów.

Jaki jest najlepszy sposób na zrobienie tego w obecnej wersji (5 wierzę)?

Odpowiedz

4

Moje rozwiązanie może być coś jak to (pseudo-kod):

<script language="javascript" type="text/javascript"> 
    var widgets; 

    $(document).ready(function() { 
     widgets = 0; 
     <% for each value in ViewData("WidgetValues") %> 
      AddWidget(<%= value %>); 
     <% next %> 
    }); 

    function AddWidget(value) { 
     $('#widgets').append("<li><input type='text' name='widget" + widgets + 
          "'>" + value + "</input></li>"); 
     widgets++; 
    } 
</script> 

<ul id="widgets"> 
</ul> 

iw sterowniku:

[AcceptVerbs("Post")] 
public ActionResult AddWidget(FormCollection form) 
{ 
    dim collValues as new Collection; 
    foreach (string s in form) 
    { 
     string t = form[s]; 
     collValues.add(t) 
    } 
    ViewData("WidgetValues") = collValues; 
    return RedirectToAction("ActionName"); 
} 

Można opracować szczegóły później
(przepraszam za mieszanie VB z C#, jestem facetem VB)

0

Możliwe, że brakuje mi tego punktu, ale czy rzeczywiście trzeba wysłać dane do kontrolera za pomocą akcji formularza? dlaczego nie wykonać wywołania ajax za pomocą jquery, aby opublikować dane w kontrolerze ... lub jeszcze lepiej serwis internetowy? wyślij dane asynchronicznie i nie trzeba przebudowywać widoku z przesłanymi wartościami danych.

Działa to dobrze, jeśli wartości są zużywane i nigdy nie są używane ponownie, jednak jeśli planujesz utrwalanie danych i wyświetlanie ich za pośrednictwem widok, twój model powinien naprawdę wspierać strukturę danych. może Dictionary<string, string> w modelu.

+0

Skryptowanie nie jest akceptowalne przy przesyłaniu danych formularzy, aplikacja musi się płynnie rozkładać bez włączonego skryptu. – blu

+4

@blu Ha? Używasz javascript przede wszystkim do budowania kontroli; jak to by się pogorszyło z js wyłączone? – Aleris

+0

Tak, mój komentarz nie ma sensu dla tej odpowiedzi. – blu

0

nie jestem programista ASP.net ale wiem z PHP, które można wykorzystać jako tablice nazw dla pól wejściowych

Ex:

<input type="text" name="widgets[]" /> 
<input type="text" name="widgets[]" /> 

Następnie można wykonać iterację pocztowych zmiennych widżetów tak jakby to był szereg wartości.

Nie aprowizacji z dynamicznie nazwie zmiennych itp

0

O ile mi zrozumieć, że problem jest, aby zachować wartości zamieszczone w widżetów. Po prostu możesz renderować te najszersze, które powinieneś wypełnić na serwerze podczas renderowania widoku.