2012-03-27 3 views
0

Ich habe ein Modell, das eine Liste eines benutzerdefinierten Typs enthält.Wie können Listenobjekte im Modell auf HttpPost beibehalten werden?

Ich möchte, dass die Daten von diesem Typ zurückgegeben werden, wenn ein Modell als HttpPost den Controller aufgerufen wird.

Allerdings scheint es nicht zu tun, was ich will. Ich bin soweit, wo ich bin, indem ich Passing IEnumerable or list Model to Controller using HttpPost folge, aber ich habe ein Problem.

Mein Controller-Methode:

[HttpPost] 
    public ActionResult UpdateStock(int id, ProductModel model) 
    { 
     return View("UpdateStock", model); 
    } 

nun die Ansicht wie dieser ist (getrimmt):

@using (Html.BeginForm()) 
{ 
<div> 
    <p> 
    <input type="submit" value="Save" /> 
    </p> 

    @Html.HiddenFor(m => m.ProductNo) 

    <div class = "title"> 
    @Html.LabelFor(m => m.ProductName) 
    @Html.EditorFor(m => m.ProductName) 
    </div> 

      @for (int i = 0; i < Model.Stock.Count; i++) 
      { 
       var item = Model.Stock[i]; 
       <div class="editor-field"> 
        <input type="text" name="Model.Stock[@i].Key" 
         value="@item.Key" /> 
       </div> 
       <div class="editor-field"> 
        <input type="text" name="Model.Stock[@i].Value" 
         value="@item.Value" /> 
       </div> 
      } 
} 

Mein Problem ist, dass es auf die @Html.EditorFor() und <input type=.../> Tags scheinen nicht scheint spielen gut miteinander. Wenn ich es wie oben beschrieben habe, werden die ProductNo und andere Eigenschaften, die @Html Methoden verwenden, nicht an das Modell übergeben.

Jeder Rat sehr geschätzt.

Antwort

2

Ich würde einfach Editor Vorlagen verwenden:

Modell:

public class ProductModel 
{ 
    public string ProductNo { get; set; } 
    public string ProductName { get; set; } 
    public IEnumerable<Stock> Stocks { get; set; } 
} 

public class Stock 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 

Controller:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new ProductModel 
     { 
      ProductNo = "123", 
      ProductName = "p name", 
      Stocks = new[] 
      { 
       new Stock { Key = "key1", Value = "value1" }, 
       new Stock { Key = "key2", Value = "value2" }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ProductModel model) 
    { 
     ... 
    } 
} 

Ausblick:

@model ProductModel 
@using (Html.BeginForm()) 
{ 
    <p> 
     <input type="submit" value="Save" /> 
    </p> 

    @Html.HiddenFor(m => m.ProductNo) 

    <div class = "title"> 
     @Html.LabelFor(m => m.ProductName) 
     @Html.EditorFor(m => m.ProductName) 
    </div> 

    @Html.EditorFor(x => x.Stocks) 
} 

und dann Sie einen benutzerdefinierten Editor-Vorlage definieren zum die Stockart (~/Views/Shared/EditorTemplates/Stock.cshtml):

@model Stock 
<div class="editor-field"> 
    @Html.EditorFor(x => x.Key) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(x => x.Value) 
</div> 
+0

Danke für die Antwort! Das funktioniert gut. – TZHX

Verwandte Themen