Domanda

Dati i seguenti tipi

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

Voglio creare un modulo di modifica per il tipo SomeModel che conterrebbe i campi di testo abituali per SomeProp1 e SomeProp2 e poi una tabella che contiene un campo di testo per ogni SomeValue nella collezione SomeModel.MyData.

Come si fa? In che modo i valori tornare legato al modello?

Al momento ho un modulo di visualizzazione di un campo di testo per ogni valore, ma tutti hanno lo stesso nome e lo stesso ID. Questo è, ovviamente, non valida HTML e impedirà MVC dalla mappatura dei valori di nuovo.

È stato utile?

Soluzione

Si potrebbe farlo utilizzando Editor modelli. In questo modo il quadro si prenderà cura di tutto (da nominare correttamente i campi di input correttamente vincolanti i valori indietro nell'azione post).

Controller:

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

Visualizza (~/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" />
<% } %>

E infine il Template Editor (~/Views/Home/EditorTemplates/SomeValue.ascx), che verrà richiamato automaticamente per ogni elemento della collezione MyData:

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

Altri suggerimenti

implementa IEnumerable IList così si potrebbe modificare il vostro modello in questo modo:

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

È possibile utilizzare l'interfaccia IModelBinder per creare un raccoglitore per il modello specifico. Ci sono un paio di modi per farlo. È possibile creare un cshtml EditorFor per il modello cui ciclo volontà attraverso la vostra lista SomeValue e di uscita ids appropriati e non quello. Poi, nell'implementazione ModelBinder tuo sarebbe poi leggere gli ID e si legano in modo appropriato. Posso inviare un campione che lavora in un po '.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top