2010-11-20 13 views
17

Verilen Aşağıdaki türler Bir IEnumerable <T>'u ASP.NET MVC 3 ile nasıl düzenlerim?

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

Sonra SomeProp1 ve SomeProp2 ve olağan metin alanlarını içerecektir tip SomeModel için bir düzenleme formunu oluşturmak istiyorum SomeModel.MyData koleksiyonunda her SomeValue için bir metin alanı içeren bir tablo .

Bu nasıl yapılır? Değerler modele nasıl bağlanır?

Şu anda her değer için bir metin alanı görüntüleyen bir formum var ama hepsi aynı ada sahip ve aynı kimliğe sahip. Bu açık bir şekilde geçerli bir HTML değildir ve MVC'nin değerleri geri eşlemesini önleyecektir.

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

Size özel model için bir bağlayıcı oluşturmak için IModelBinder arabirimini kullanabilirsiniz: Eğer şöyle modelinizi değiştirmek böylece

cevap

14

Bunu Editor Şablonları kullanarak yaparsınız. Bu şekilde çerçeve herşeyi ele alacaktır (doğru bir şekilde giriş alanlarının doğru bir şekilde post eylemine geri bağlanması).

Denetleyici:

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

Ve

nihayet otomatik MyData koleksiyonun her bir eleman için çağrılır Editör Şablon ( ~/Views/Home/EditorTemplates/SomeValue.ascx):

<%@ 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, sanırım şimdi göndermeyeceğim çünkü cevabınız zaten daha iyi :) Eğer kolayca listelerini bağlayabileceğinizi bilmiyordum. MVC3 için – Buildstarted

+2

Teşekkürler Razor kullanmak daha iyi değil mi? – arame3333

1

IList IEnumerable uygular. Bunu yapmanın birkaç yolu var. Modeliniz için EditorFor cshtml oluşturarak, SomeValue listeniz arasında dolaşacak ve uygun kimlikler üretip nelerin çıkmayacağını belirleyebilirsiniz. Ardından, ModelBinder uygulamanızda, sizin kimliklerinizi okuyup uygun şekilde bağlarsınız. Bir süre çalışma örneği gönderebilirim.

+0

Form gönderildiğinde, ViewEngin olacak e Verileri Koleksiyondaki doğru öğelere geri bağlama konusunda özen gösterin. –

+0

Gerçekten garip olanı biliyorsun ... ** Yemin edebilirdim ** bu soru farklı bir şey sordu ... Aynı anda iki soru okuduğumu ve yanlış olana cevap verdiğimi düşünüyorum. cevabımı değiştir – Buildstarted