2010-11-20 10 views
17

Biorąc pod uwagę następujące rodzajeJak edytować IEnumerable <T> z ASP.NET MVC 3?

public class SomeValue 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
} 

public class SomeModel 
{ 
    public string SomeProp1 { get; set; } 
    public string SomeProp2 { get; set; } 
    public IEnumerable<SomeValue> MyData { get; set; } 
} 

Chcę utworzyć formularz edycji dla typu SomeModel które zawierają zwykłe pola tekstowe dla SomeProp1 i SomeProp2 a następnie tabelę zawierającą pole tekstowe dla każdego SomeValue w kolekcji SomeModel.MyData .

Jak to zrobić? W jaki sposób wartości zostają przywrócone do modelu?

Mam obecnie formularz wyświetlający pole tekstowe dla każdej wartości, ale wszystkie mają tę samą nazwę i ten sam identyfikator. Jest to oczywiście niepoprawny kod HTML i uniemożliwi MVC odwzorowanie wartości z powrotem.

Odpowiedz

14

Można to zrobić za pomocą Edytora szablonów. W ten sposób framework zajmie się wszystkim (od poprawnego nazwania pól wejściowych do poprawnego powiązania wartości z powrotem w akcji post).

Kontroler:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // In the GET action populate your model somehow 
     // and render the form so that the user can edit it 
     var model = new SomeModel 
     { 
      SomeProp1 = "prop1", 
      SomeProp2 = "prop1", 
      MyData = new[] 
      { 
       new SomeValue { Id = 1, Value = 123 }, 
       new SomeValue { Id = 2, Value = 456 }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(SomeModel model) 
    { 
     // Here the model will be properly bound 
     // with the values that the user modified 
     // in the form so you could perform some action 
     return View(model); 
    } 
} 

View (~/Views/Home/Index.aspx):

<% using (Html.BeginForm()) { %> 

    Prop1: <%= Html.TextBoxFor(x => x.SomeProp1) %><br/> 
    Prop2: <%= Html.TextBoxFor(x => x.SomeProp2) %><br/> 
    <%= Html.EditorFor(x => x.MyData) %><br/> 
    <input type="submit" value="OK" /> 
<% } %> 

I wreszcie Template Editor (~/Views/Home/EditorTemplates/SomeValue.ascx), które zostaną automatycznie wywoływana dla każdego elementu kolekcji MyData:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.SomeValue>" %> 
<div> 
    <%= Html.TextBoxFor(x => x.Id) %> 
    <%= Html.TextBoxFor(x => x.Value) %> 
</div> 
+0

Heh, myślę, że nie opublikuję go teraz, ponieważ odpowiedź jest już lepsza :) Nie wiedziałem, że możesz tak łatwo wiązać listy. Dzięki – Buildstarted

+2

dla MVC3 czy lepiej nie używać Razor? – arame3333

1

IList implementuje IEnumerable więc można zmodyfikować swój model tak:

public class SomeModel { 
    public string SomeProp1 { get; set; } 
    public string SomeProp2 { get; set; } 
    public IList<SomeValue> MyData { get; set; } 
} 

Można użyć interfejsu IModelBinder stworzyć wiążący dla konkretnego modelu. Jest kilka sposobów na zrobienie tego. Możesz utworzyć cshtml EditorFor dla modelu, który przejdzie przez twoją listę SomeValue i wypisze odpowiednie identyfikatory, a także nie. Następnie, w twojej implementacji ModelBinder, twój odczytałby twoje identyfikatory i odpowiednio je związał. Mogę opublikować działającą próbkę od jakiegoś czasu.

+0

Po przesłaniu formularza, zobaczy ViewEngin e dbamy o powiązanie danych z odpowiednimi elementami w Kolekcji? –

+0

Wiesz co jest naprawdę dziwne ... Mógłbym ** przysiąc ** to pytanie zadać coś innego ... Myślę, że czytałem dwa pytania w tym samym czasie i odpowiedziałem niewłaściwemu ... Mam zamiar zmień moją odpowiedź – Buildstarted

Powiązane problemy