Frage

In Anbetracht der folgenden Typen

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

Ich möchte eine Bearbeitungsformular für den Typ SomeModel schaffen, die die üblichen Textfelder für SomeProp1 und SomeProp2 und dann eine Tabelle, die ein Textfeld für jede SomeValue in der SomeModel.MyData Sammlung enthalten würde.

Wie wird das gemacht? Wie unterscheiden sich die Werte an das Modell gebunden zurück?

Im Moment habe ich ein Formular für jeden Wert ein Textfeld angezeigt wird, aber sie alle haben die gleichen Namen und die gleiche ID. Dies ist natürlich nicht valides HTML und MVC verhindert, dass die Werte abbildet zurück.

War es hilfreich?

Lösung

Sie würden es tun Editor Vorlagen. Auf diese Weise der Rahmen um alles kümmern wird (von richtig die Eingabefelder zu benennen, um richtig verbindlich die Werte in der Post Aktion zurück).

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

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

Und schließlich die Editor-Vorlage (~/Views/Home/EditorTemplates/SomeValue.ascx), die automatisch für jedes Element der MyData Sammlung aufgerufen werden:

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

Andere Tipps

IList implementiert IEnumerable, so dass Sie Ihr Modell wie so ändern könnte:

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

Sie können die IModelBinder-Schnittstelle verwenden, um ein Bindemittel für Ihr spezifisches Modell zu erstellen. Es gibt ein paar Möglichkeiten, es zu tun. Sie können einen EditorFor cshtml für das Modell, das wird Schleife durch Ihre SomeValue und die auszugebenden entsprechende IDs erstellen und was nicht. Dann in Ihrer ModelBinder Implementierung würden Sie dann durch Ihre ids lesen und binden Sie sie ordnungsgemäß. Ich kann eine Arbeitsprobe in einer Weile stellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top