2011-03-17 23 views
8

मैं एक इकाई Domain.Models.BlogPost जो निम्नलिखित गुण होता है कहा जाता है:ASP.NET MVC 3 मॉडल बाध्यकारी और प्रपत्र फ़ील्ड्स

  • postid
  • शीर्षक
  • लेखक
  • PostedDate
  • शरीर

मेरे पासनामक एक इकाई भी हैजो निम्नलिखित गुण शामिल हैं:

  • CommentID
  • postid
  • लेखक
  • ईमेल
  • वेबसाइट
  • शरीर

BlogPost शामिल कई PostComments। कई रिश्तों में से एक।

अब मैं इस (एचटीएमएल टिप्पणी के माध्यम से ब्लॉग पोस्ट कोड से अलग टिप्पणी फार्म) की तरह एक दृश्य है:

@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") 

समस्या है कि क्योंकि टिप्पणी प्रपत्र @Html.TextBox("Author") और @Html.TextBox("Body") का उपयोग करता है, वे डेटा के साथ से भर जाते हैं मॉडल, जिसमें गुण Author और Body भी शामिल हैं। इस फिक्स को कैसे ठीक किया जाए इस पर कोई सुझाव है कि पेज फ़ील्ड लोड होने पर इन फ़ील्ड में मूल्य नहीं लगाए जाते हैं?

मैं भी एक BlogPostViewModel बनाने और स्थापित करने की कोशिश की है कि देखने के मॉडल और अपने वास्तविक मॉडल के साथ BlogPost संपत्ति बताए के रूप में:

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

तब मैं @Html.TextBoxFor(x => x.NewComment.Author) किया, लेकिन जब प्रपत्र इस कार्रवाई विधि पर पोस्ट किया:

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

postComment प्रपत्र मूल्यों के लिए बाध्य नहीं किया:/

+3

यह डिफ़ॉल्ट मॉडल बांधने की मशीन का एक बदसूरत तथ्य है। मैंने इसे कुछ बार मारा है। मेरा सबसे अच्छा समाधान जोड़ने के लिए [बाइंड (बहिष्कृत = "लेखक, बॉडी")] जोड़ना है और फिर स्नैफ़ू को मैन्युअल रूप से ठीक करना है। मुझे एक बेहतर दृष्टिकोण सुनना अच्छा लगेगा। –

+0

मुझे एक बेहतर दृष्टिकोण भी सुनना अच्छा लगेगा। – Chev

+0

अपने अपडेट को देखा, न्यूकॉममेंट उपसर्ग के आधार पर बाध्यकारी आज़माएं। यानी [बाइंड (उपसर्ग = "न्यूकॉममेंट")] पैरामीटर पोस्टकॉममेंट पोस्ट कॉमेंट –

उत्तर

6

आप या तो AddComment अनुभाग में फ़ील्ड का नाम बदल सकते हैं जो मॉडल में नामित गुणों के साथ टकराव नहीं करता है, या आप एक अलग ओवरलोड का उपयोग करके दृश्य में मूल्य को ओवरराइड कर सकते हैं Html.TextBoxThis overload of TextBox takes a value:

मूल्य (प्रकार: System.Object)
पाठ इनपुट तत्व का मान। यदि यह मान शून्य है, तो तत्व का मान ViewDataDictionary ऑब्जेक्ट से पुनर्प्राप्त किया गया है। यदि कोई मान मौजूद नहीं है, तो मॉडल ModelStateDictionary ऑब्जेक्ट से पुनर्प्राप्त किया जाता है।


अद्यतन: चूंकि आप "NewComment" एक संपत्ति के रूप में जोड़ा गया है और नामकरण टक्कर कि जिस तरह से संपत्ति का समाधान, सभी कि आप की आवश्यकता कार्रवाई करने के लिए पोस्ट पर पूरे दृश्य मॉडल के बजाय एक PostComment बाध्य करने के लिए क्या करने के लिए , मॉडल बाइंडर को निर्देश देना है कि एक उपसर्ग का उपयोग किया जाएगा। यह BindAttribute का उपयोग करके किया जाता है।

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

हम्म, ठीक है, दो लोग मुझे मूल्य को 'स्ट्रिंग' के लिए ओवरराइड करने के लिए कह रहे हैं। इसलिए मुझे लगता है कि मैं यही करूँगा। मैंने सोचा कि मॉडल/दृश्य को ढूढ़ने का एक बेहतर तरीका होगा ताकि ये टकराव भी न हो। – Chev

+0

टक्कर से बचने के लिए आप इसे एक अलग तरीके से बना सकते हैं। @ जकूब कोनेकी सही रास्ते पर है। BlogPost मॉडल क्लास में "न्यूकॉममेंट" नामक एक पोस्ट कॉमेंट संपत्ति जोड़ें। फिर आपका व्यू कोड @ Html.TextBoxFor (x => x.NewComment.Body) जैसा दिखाई देगा; –

+0

को छोड़कर मुझे सरल 'पोस्टकॉममेंट' ऑब्जेक्ट को स्वीकार करने के बजाय, 'AddComment' एक्शन विधि' में पैरामीटर के रूप में दृश्य मॉडल को स्वीकार करना होगा। जैसा कि सवाल में बताया गया है, मैंने पहले ही यह कोशिश की है। – Chev

0

है TextBox पर एक अधिभार नहीं है जो एक मूल्य लेता है? आप बस string.Empty पास कर सकते हैं ...

+0

हाँ, लेकिन यह हैकिश लगता है। ऐसा लगता है कि एक बेहतर तरीका होना चाहिए। – Chev

+0

लेकिन मेरा मानना ​​है कि वह उस मूल्य को चाहता है जो उपयोगकर्ता डालता है। POST होने के बाद उपयोगकर्ता का मान डिफ़ॉल्ट मॉडल बाइंडर द्वारा गिरफ्तार किया जा रहा है। –

+0

मुझे लगता है कि यह एक उचित तरीका है - आप एक खाली फॉर्म प्रस्तुत करना चाहते हैं। आप पोस्टकॉममेंट के खाली उदाहरण से जुड़ सकते हैं .... –

1

ASP का उपयोग करें नेट MVC टेम्पलेट्स आप क्या आबादी वाले हो जाता है पर पूरा नियंत्रण है और यह प्रकार सुरक्षित है तो।

तो आप .ascx टेम्पलेट बनाएंगे जो दृढ़ता से टाइप किए गए Comment लेता है। अपने मॉडल में, आप वहां एक खाली छोड़ देते हैं।

+0

क्या इसका मतलब यह नहीं होगा कि 'AddComment' एक्शन विधि को' BlogPostViewModel' को केवल 'पोस्टकॉममेंट' के बजाय पैरामीटर के रूप में स्वीकार करना होगा? ऐसा लगता है कि एक खाली मॉडल ऑब्जेक्ट को सभी रिक्त गुणों के साथ वापस छोड़कर एक के बाद पोस्ट किया गया है। शायद मैं गलत हूं और यह पूरी तरह से सामान्य है। – Chev

+0

नहीं। आप 'Model.EditorFor (m => m.comment)' – Aliostad

+0

देखें हां में, लेकिन कार्रवाई विधि को एक दृश्य मॉडल ऑब्जेक्ट को स्वीकार करने की आवश्यकता होगी, न कि 'PostComment' ऑब्जेक्ट सही? मैं अब सत्यापित करने के लिए इसका परीक्षण कर रहा हूं। – Chev

संबंधित मुद्दे