2011-03-17 11 views
8

ben bir varlık aşağıdaki özellikleri içerir Domain.Models.BlogPost denilen vardır: ASP.NET MVC 3 Modeli bağlayıcı ve form alanları

  • Başlığı
  • Yazar
  • PostedDate
  • Vücut
    • POSTID

    Ayrıcaadında bir varlığım var aşağıdaki özellikleri içerir:

    • CommentID
    • POSTID
    • Yazar
    • Eposta
    • Vücut

    BlogPost birçok PostComments içeriyor

  • İnternet sitesi. Bire çok ilişki.

    Şimdi bu (html açıklama ile blog yazısı kodundan ayrılan yorum formu) böyle bir manzara:

    yorum formu @Html.TextBox("Author") ve @Html.TextBox("Body") kullanması nedeniyle, bunlar verilerle doldurulur ki
    @model Domain.Models.BlogPost 
    @using Domain.Models; 
    @{ 
        ViewBag.Title = "Post"; 
    } 
    <div class="postTitle">@Model.Title</div> 
    <div class="subInfo"> 
        Posted by @Model.Author on @Model.PostedDate.ToString("D") 
    </div> 
    <div class="postBody"> 
        @Html.Markdown(Model.Body) 
    </div> 
    <br /> 
    @Model.PostComments.Count Comment(s). 
    <div class="comments"> 
    @foreach (PostComment postComment in Model.PostComments) 
    { 
        Html.RenderPartial("PostComment", postComment); 
    } 
    </div> 
    
    <!-- BELOW IS THE ADD COMMENT FORM --> 
    
    <div id="addComment"> 
    @using (Html.BeginForm("AddComment", "Blog")) 
    { 
        <text> 
        @Html.Hidden("PostID", Model.PostID)<br /> 
        Name: @Html.TextBox("Author")<br /> 
        Email: @Html.TextBox("Email")<br /> 
        Website: @Html.TextBox("Website")<br /> 
        Body: @Html.TextArea("Body")<br /> 
        <input type="submit" value = "Add Comment" /> 
        </text> 
    } 
    </div> 
    @Html.ActionLink("Add Comment", "AddComment") 
    

    Author ve Body özelliklerini de içeren model. Bunu nasıl düzelteceğinize dair herhangi bir öneri, bu sayfalar yüklendiğinde, bu alanların değerlerini almaması için mi?

    Ben de bir BlogPostViewModel oluşturma ve ayarlama çalıştı görüşündedir modeli ve benim gerçek modeli ile BlogPost özelliği atamak gibi:

    public class BlogPostViewModel 
    { 
        public BlogPost BlogPost { get; set; } 
        public PostComment NewComment { get; set; } 
    } 
    

    Sonra @Html.TextBoxFor(x => x.NewComment.Author) yaptım ama formu bu eylem yöntemine yayınlanmıştır:

    public ActionResult AddComment(PostComment postComment) 
    { 
        // ... 
    } 
    

    postComment formu değerlerine bağlamak vermedi:/

  • +3

    Bu, varsayılan model ciltleyicisinin çirkin bir gerçektir. Bunu birkaç kez vurdum. En iyi çözümüm, [Bind (Exclude = "Author, Body")] eylemini eklemek ve ardından snafu'yu manuel olarak düzeltmek oldu. Daha iyi bir yaklaşım duymayı çok isterim. –

    +0

    Daha iyi bir yaklaşımı duymak isterim. – Chev

    +0

    Güncellemenizi gözden geçirin, NewComment önekini temel alarak bağlamayı deneyin. Yani PostComment postComment –

    cevap

    6

    AddComment bölümündeki alanları, Modelde adlandırılan özelliklerle çakışmayan bir şeye yeniden adlandırabilir veya farklı bir aşırı yükleme kullanarak görünümdeki değeri geçersiz kılabilirsiniz. Html.TextBoxThis overload of TextBox takes a value:

    değeri (Tür: System.Object) metin giriş elemanının
    değer. Bu değer boşsa, öğenin değeri ViewDataDictionary nesnesinden alınır. Orada herhangi bir değer yoksa, bu değer ModelStateDictionary nesnesinden alınır.


    GÜNCELLEME: Bir özelliği olarak "YeniAçıklama" eklenmiş ve çarpışma bu şekilde adlandırma özelliği giderilmiş olduğundan, gereken tüm eylem POST üzerinde bütün görünümü modelden ziyade bir PostComment bağlamak yapmak , bir önekin kullanılacağı model bağlayıcısına talimat vermektir. Bu BindAttribute kullanılarak yapılır.

    public ActionResult AddComment([Bind(Prefix = "NewComment")] PostComment postComment) 
    
    +0

    Hmmm, tamam o zaman iki kişi, 'string.Empty' değerini geçersiz kılmam gerektiğini söylüyor. Ben sadece bu çarpışmaların meydana gelmemesi için modelleri/görünümü yapılandırmanın daha iyi bir yolu olacağını düşündüm. – Chev

    +0

    Çarpışmayı önlemek için bunu farklı bir şekilde yapılandırabilirsiniz. @Jakub Konecki doğru yolda. BlogPost model sınıfına "NewComment" adlı bir PostComment özelliği ekleyin. Sonra görünüm kodunuz @ Html.TextBoxFor (x => x.NewComment.Body) gibi görünecektir; –

    +0

    sağ dışında, basit bir 'PostComment' nesnesini kabul etmek yerine, görünüm modelini 'AddComment 'yönteminde bir parametre olarak kabul etmek zorundayım. Soruda belirtildiği gibi, bunu bir kez denedim. – Chev

    0

    mi TextBox üzerinde bir değer alan aşırı yük yok mu? string.Empty ...

    +0

    Evet, ama bu hackish gibi görünüyor. Daha iyi bir yol olmalı. – Chev

    +0

    Ancak kullanıcının koyduğu değeri istediğine inanıyorum. Kullanıcının değeri POST oluştuktan sonra varsayılan model bağlayıcı tarafından klobberleniyor. –

    +0

    Bunun uygun bir yol olduğunu düşünüyorum - boş bir form oluşturmak istiyorsunuz. PostComment'ın boş bir örneğine bağlanabilirsiniz .... –

    1

    Kullanım ASP NET MVC şablonları nüfuslu Nelerin üzerinde tam kontrol sahibi ve tip-güvenli yani.

    Bu nedenle, Comment numaralı kaba yazılan bir .ascx şablonunu oluşturmanız gerekir. Modelinde, orada boş bir tane var.

    +0

    Bu, 'AddComment' eylem yönteminin 'PostComment' yerine 'BlogPostViewModel' parametresini kabul etmesi gerektiği anlamına gelmez mi? Bu, bir model model nesnesini, geride bıraktığımın dışındaki tüm boş özelliklere sahip geri gönderirken tuhaf görünüyor. Belki yanılıyor ve bu tamamen normal. – Chev

    +0

    Hayır. 'Model.EditorFor (m => m.Comment) ' – Aliostad

    +0

    ' u geçersiniz. Evet görünümünde, ancak eylem yöntemi bir 'PostComment' nesnesi değil, bir görünüm model nesnesini kabul etmeyi gerektirirdi? Doğrulamak için şimdi test ediyorum. – Chev