10

Tamam, bu garip. ASP.NET MVC'de BindAttribute'un Include ve Exculude özelliklerini karmaşık iç içe geçmiş nesnelerle kullanamıyorum.bağlama özniteliği, iç içe geçmiş nesneler içeren özelliği içerme ve hariç tutma

public class FooViewModel { 

    public Enquiry Enquiry { get; set; } 
} 

public class Enquiry { 

    public int EnquiryId { get; set; } 
    public string Latitude { get; set; } 
} 

HTTP Post eylemi::

[ActionName("Foo"), HttpPost] 
public ActionResult Foo_post(
    [Bind(Include = "Enquiry.EnquiryId")] 
    FooViewModel foo) { 

    return View(foo); 
} 

Görünüm:

@using (Html.BeginForm()) { 

    @Html.TextBoxFor(m => m.Enquiry.EnquiryId) 
    @Html.TextBoxFor(m => m.Enquiry.Latitude) 

    <input type="submit" value="push" /> 
} 

de çalışmıyor mu

Bu benim modelidir: Burada

ne yaptım herşey.

[Bind(Include = "EnquiryId")] 
public class Enquiry 
{ 
    public int EnquiryId { get; set; } 
    public string Latitude { get; set; } 
} 

ve eylem:

How do I use the [Bind(Include="")] attribute on complex nested objects?

+1

En iyi bahsinizin, referans verdiğiniz diğer postada açıklandığı gibi yapmak olduğunu düşünüyorum. – JoJa

+0

Evet, öyle görünüyor: Bunu etki alanı modeli projesinde yapamıyorum. Mvc projesinin içinde kısmi sınıfları tanımlamalı ve bunu düşündüğümü yapmalıyım. – tugberk

+0

Benim çözümüm burada https://stackoverflow.com/questions/47644699/how-to-bind-nested-objects-on-httppost-in-asp-net-mvc/47645228#47645228 –

cevap

15

Evet, bu işe yapabilirsiniz: burada belirtildiği gibi Enquiry sınıf için BindAttribute tanımlarsanız sadece bu işi yapabilir miyim:

[ActionName("Foo"), HttpPost] 
public ActionResult Foo_post(FooViewModel foo) 
{ 
    return View(foo); 
} 

Bu bağlanma yalnızca EnquiryId dahildir ve Latitude nul bırakacaktır l.

Bu, Bind özelliğini kullanmanızın size önereceğim bir şey olmadığı söyleniyor. Benim önerim, görünüm modellerini kullanmaktır. Bu görünüm modellerinde, yalnızca bu belirli görünüm için anlamlı olan özellikleri içerirsiniz.

Yani basitçe görünüm modellerini readapt: ​​Orada

public class FooViewModel 
{ 
    public EnquiryViewModel Enquiry { get; set; } 
} 

public class EnquiryViewModel 
{ 
    public int EnquiryId { get; set; } 
} 

gitmek. Bağlanma konusunda endişelenmenize gerek yok. IMHO'nun bunu yapmanın daha iyi bir yolu olduğu

+0

thanks @darin. Bu tek yol gibi görünüyor. Bu işe dalmadım, ama yeni bir özel model ciltleyici oluşturarak bu işi yapmak için 'DefaultModelBinder' sınıfını değiştirebilir miyiz? – tugberk

+2

@tugberk, Gerçekten bu rotaya gitmeyecektim. Görünüm modellerini kullanmak, bu tür problemleri çözmenin yoludur. Ve sadece bu tür problemler değil. Her zaman bir ASP.NET MVC uygulamasında görünüm modellerini kullanmalısınız. –

+0

İkinci öneri için, ben her zaman bunun için aradayım: s – tugberk

1

.

Görünüm modelinde birden çok modeliniz varsa, post denetleyicinin imzası, görünüm modelinin tersine aynı modelleri içerecektir.

I.E.

public class FooViewModel { 
    public Bar BarV { get; set; } 
    public Enquiry EnquiryV { get; set; } 
    public int ThisNumber { get; set; } 
} 

public class Bar { 
    public int BarId { get; set; } 
} 

public class Enquiry { 
    public int EnquiryId { get; set; } 
    public string Latitude { get; set; } 
} 

Denetleyicideki post eylemi buna benzer. Görünüm hala unutmayın bu

@using (Html.BeginForm()) { 

    @Html.TextBoxFor(m => m.EnquiryV.EnquiryId) 
    @Html.TextBoxFor(m => m.EnquiryV.Latitude) 
    @Html.TextBoxFor(m => m.BarV.BarId) 
    @Html.TextBoxFor(m => m.ThisNumber) 

    <input type="submit" value="push" /> 
} 

benziyor ederken

[ActionName("Foo"), HttpPost] 
public ActionResult Foo_post(
    [Bind(Include = "EnquiryId")] 
    Enquiry EnquiryV, 
    [Bind(Include = "BarId"])] 
    Bar BarV, 
    int ThisNumber 
{ 
    return View(new FooViewModel { Bar = BarV, Enquiry = EnquiryV, ThisNumber = ThisNumber }); 
} 

Tüm bu formu hala dahil değildir ancak bu yana, sırt (bunu kurmak vardı şekilde) Latitude yayınlayacağız Post eylemi için Sorgulama dizgisini ekle, eylem sonuçta ortaya çıkan Sorguda yeni değeri kabul etmeyecektir. Ek yayınlama verilerini önlemek için enlemi devre dışı bırakmayı veya form öğesinin oluşturmamalarını öneririm.

Başka bir senaryoda, yalnızca iyi bir şekilde kullanabilirsiniz, ancak bazı nedenlerden dolayı karmaşık modeller için nokta gösterimini beğenmez.

Bir yan not olarak, kod çoğaltma gibi diğer sorunlara neden olabileceğinden, sınıftaki bağlama özniteliğini doğrudan koyamazdım ve farklı bir bağlamaya sahip olmak isteyebileceğiniz belirli senaryoları hesaba katmaz.

(Değişken adlarını biraz açıklığa göre değiştirdim. Ayrıca, sorununun oldukça tarihli olduğunu da biliyorum, ancak cevabın kendiliğinden araştırılmasından önce, kendi çözümümüzü denemeden önce, ilk çözüm olduğum yerdeyim. Ben aynı sorunun çözümü arayan diğer insanlara yardımcı olabileceğini umuyorum.)

İlgili konular