2011-03-25 19 views
11

Verileri içeren TextBoxFor kullanarak 1 metin kutusu var.Razor MVC modeli, Ver eylem kaydet

Model için bir Kimlik ve diğer bazı temel veriler var ancak doğrudan Görünüm olarak etiketler olarak gösteriliyor.

Formu gönderdiğimde, yalnızca metin kutusu alanında modelin verileri var, Id dahil her şey boştur. Bu, veritabanına kaydedilmeyeceği anlamına gelir.

Tüm alanların metin kutusundan ayrı olmasına neden olur?

+0

Post Lütfen kodunuzu yazın .. –

+1

Lütfen problemi gösteren * minimal * (yani, uygulamanızın tamamı değil) kodunu gönderin. Görünüm kodunuzu ve ilgili eylem yöntemlerini ekleyin. – marcind

+0

@Bugai, Kod olmadan sorunu teşhis etmek zor biliyorum, ancak 1) görünüm boyunca büyük kod parçaları olduğunda gerçekten çok zor gönderme kodu, 2) kontrolör, 3) model ve bunların hepsi içeriği içeren problemle alakasız. – jaffa

cevap

16

Bu şekilde web eserler, sadece oluştururlar elemanları formu ile gönderilen ve etiketler elemanlarını oluştururlar değildir.

  1. parametreleri veya bir şekilde (
  2. Denetleyiciniz eylem Değişiklikleri kabul metin kutuları ile birlikte kimliği içeren gizli bir alan (Html.Hidden/Html.HiddenFor) Render: Yaygın burada ne olur

    Bunun ne nesne)

  3. hidrat sizin deposundan Id içeren nesneye/veritabanı
  4. örneği hidratlı örneğine değişiklikleri uygula
  5. doğrula nesnenin devlet ve depo/veritabanını güncellemek (veya onunla yapmayı planladıklarını neyse) yayınlanmıştır veri sınıfının olarak

sıklıkla nedeniyle eksik özellikleri (o [Required] şeklinde işaretlenmiş "geçersiz" olduğunu örneğin, yalnızca değiştirilmekte olan özelliklere sahip olan yeni bir sınıf yapmak çok yaygındır ("komut modeli" olarak adlandırılır). Bu sınıf kendi doğrulama özelliklerine sahip olabilir ve bu nedenle form doğrulamanızla uğraşmaz.

+0

Mükemmel, net ve özlü yanıt için teşekkürler. Bu onu çok daha net bir hale getiriyor, beynimin webform zihniyetini ortadan kaldırmak için üzerimde biraz iş var! – jaffa

6

Yalnızca girişler sunucuya geri gönderilir. Modelin, sayfadaki verilere göre doldurulmasını istiyorsanız, girişler (veya URL'nin bir kısmı) olmalıdır. Etiket öğelerindeki veriler, forma (bu standart HTML form davranışıdır) sunucuya gönderilmez. Genellikle düzenlenebilir olmayan model verilerini geri yüklemek için gizli alanları kullanırsınız veya sadece model kimliğine başvurup veritabanından yeniden düzenleyerek düzenlenebilir özellikleri (aşağıdaki gibi) güncellersiniz.

Örnek:

@(using Html.BeginForm(new { id = Model.ID })) 
{ 
     <p> 
      <label>Fixed Property:</label> 
      @Model.SomeFixedProperty 
     </p> 
     <p> 
      @Html.LabelFor(m => m.EditableProperty) 
      @Html.TextBoxFor(m => m.EditableProperty) 
     </p> 
} 

Kontrolör

[HttpPost] 
public ActionResult Foo(int id, string editableProperty) 
{ 
    var model = repo.GetById(id); 
    model.EditableProperty = editableProperty; 
    repo.Save(); 
    return View(model); 
} 
+0

Tamam, ancak 10 etiket gösteren bir formunuz varsa ve düzenleme için 1 etiketiniz varsa. Her şeyi sıfırlanmadan bu veriyi modele nasıl geri alabilirim? Göründüğü gibi, ViewState'in çözeceği büyük bir sorun mu var? – jaffa

+1

@Jon - (1) İhtiyacınız olan her şey için etiketle birlikte yan yana duran gizli alanlar, (2) önceki istekte bulunan verileri tutmak için TempData'yı kullanın veya (3) gerekli verileri yeniden formüle etmek için yeterli bilgiyi ekleyin . ViewState aslında veriler şifreli olsa da (1) yapar. Sen seçtiysen, bu işlevselliği çoğaltabilirsin ama bunu tavsiye etmem. Söylediklerinizden, muhtemelen (3) 'ü seçerim ve model kimliğini url'ye eklerim. Denetleyicinizin eylemi kimliği ve güncel verileri parametre olarak almasını sağlayın. Modeli DB'den al ve sadece gerekli olanı değiştir. – tvanfosson

+0

@Jon - Lütfen oturum durumuna bakın ve 'TempData''nın sardığı gibi' TempData'ya güvenmeden önce nasıl ölçeklendiğini anlayın. –

0

@RichardSzalay ile aynı fikirdeyim, ancak başka bir yol değiştirilmemiş olarak değiştirilmemiş özellikleri işaretlemek olacaktır.

Bu özelliklere sahip bir modeliniz olduğunu varsayalım: Id, Name, Email. Ve E-posta'yı değiştirmek istemezsiniz.

public ActionResult ChangeName([Bind(Include="Id,Name")] User model) 
{ 
    // ... 
    db.Entry(model).State = EntityState.Modified; 
    db.Entry(model).Property(m => m.Email).IsModified = false; 
    db.SaveChanges(); 
    // ... 
} 

Dezavantajı, modeldeki eksik alanlar nedeniyle doğrulama sorunlarıyla karşılaşmanız olabilir.

İlgili konular