2012-10-24 12 views
5

मैं निम्नलिखित मॉडल हैं:
एमवीसी मॉडल सत्यापन?

public class FileModel 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Required")] 
    [StringLength(100, ErrorMessage = "Max is 100, Min is 3", MinimumLength = 3)] 
    public string Name { get; set; } 

    public string Path { get; set; } 

    [Required(ErrorMessage = "Required")] 
    public string FileTypeId { get; set; } 

    public DateTime RegistrationDate { get; set; } 
} 

निम्नलिखित मेरे विचार है:

@using (Html.BeginForm("Index", "FileManagement", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <table class="content-table" style="min-width: 600px; border-spacing: 15px;"> 
     <tr> 
      <td colspan="4" class="table-header">New File 
       <div class="add-icon">+</div> 
      </td> 
     </tr> 
     <tr> 
      <td>Name: </td> 
      <td>@Html.TextBoxFor(q => q.NewFile.Name, new { maxlength = "100", id = "NewFile_Name1", name = "NewFile.Name1" }) 
       <br />@Html.ValidationMessageFor(q => q.NewFile.Name) 
      </td> 
      <td> 
       <input type="file" id="FileUploadField1" /></td> 
      <td style="width: 16px; text-align: center;">&nbsp;</td> 
     </tr> 
     <tr> 
      <td colspan="4" style="text-align: center;"> 
       <input type="submit" value="Submit" /> 
      </td> 
     </tr> 
    </table> 
    <script type="text/javascript"> 

     $('.content-table .add-icon').click(function() { 
      var lastFileField = $('.content-table input[type="file"]').last(); 
      var lastId = lastFileField.attr('id').replace(/\D*/g, ''); 
      lastId = parseInt(lastId) + 1; 
      var newFields = '<tr>' + 
       '<td>Name : </td>' + 
       '<td><input data-val="true" data-val-length="Max chars is 100, Min chars is 3" data-val-length-max="100" data-val-length-min="3" data-val-required="Required" id="NewFile_Name' + lastId + '" name="NewFile.Name' + lastId + '" type="text" value="" /><br /><span class="field-validation-valid" data-valmsg-for="NewFile.Name' + lastId + '" data-valmsg-replace="true"></span></td>' + 
       '<td><input type="file" id="FileUploadField' + lastId + '"/></td>' + 
       '<td style="text-align:right;"><div class="delete-icon"></div></td>' + 
       '</tr>'; 
      var lastTr = $(lastFileField).parents('tr:first')[0]; 
      $(lastTr).after(newFields); 
     }); 

     $('.content-table .delete-icon').live('click', function() { 
      $(this).parents('tr:first').remove(); 
     }); 
    </script> 
} 

आप देख सकते हैं, हम एक या अधिक फ़ाइलों को अपलोड करने के लिए एक रूप है। इसलिए, मैंने उपयोगकर्ताओं के लिए एक + बटन जोड़ा है कि वे फ़ॉर्म में फ़ाइल फ़ील्ड जोड़ सकते हैं।

उपयोगकर्ताओं को फ़ाइल का नाम दर्ज करना होगा और अपलोड करने के लिए एक फ़ाइल का चयन करना होगा। लेकिन एमवीसी क्लाइंट सत्यापनकर्ता केवल पहले इनपुट को मान्य करता है जो Razor के साथ जोड़ा गया है।

क्लाइंट साइड और सर्वर पक्ष में सभी फ़ील्ड को सत्यापित करने के लिए मैं एमवीसी सत्यापनकर्ता को कैसे मजबूर कर सकता हूं।

एक और सवाल यह है:
हम एक MVC नियंत्रक में फ़ील्ड मान रही कैसे संभाल सकते हैं।

धन्यवाद

उत्तर

8

This great blog आप समझते हैं कि डिफ़ॉल्ट मॉडल बांधने की मशीन सूचियों और सरणियों आबद्ध करेगा मदद मिलेगी। बस है कि इस तरह कुछ हद तक लग रहा है अपने पृष्ठ के लिए एक ViewModel बनाने:

public class FileUploadViewModel 
{ 
    public List<FileModel> lFileModels { get; set; } 
} 
फिर अपने "+" jQuery समारोह में

, सुनिश्चित करें कि उत्पन्न इनपुट नाम lFileModels.[0].Title की तरह कुछ कर रहे हैं (या इसे lFileModels[0].Title हो सकता है, सिर्फ इतना है कि लिंक पर क्लिक करें और आप इसे समझ लेंगे)

फिर उस जानकारी को नियंत्रक में प्राप्त करने के लिए, यह किसी अन्य रूप की तरह है!

[HttpPost] 
public ActionResult Index(FileUploadViewModel viewModel) 
{ 

} 

संपादित

Another link MVC फ़ाइल

संपादित 2

अपलोड करने एक बार फिर से अपने कोड को पढ़ने के बाद के लिए, मैं अब महसूस करते हैं कि मान्यता समस्या विनीत जोड़ने की वजह से है लाइब्रेरी लोड होने के बाद सत्यापन। आपको वैधताओं को दोबारा जोड़ना होगा।

$("form").data("validator", null); 
$.validator.unobtrusive.parse($("form")); 

बाइंडिंग सर्वर-साइड सत्यापन और आपके प्रश्न के दूसरे भाग पर लागू होती है।

संपादित 3

फ़ील्ड जोड़ने के बजाय सीधे जे एस में यह कर के लिए, आप अजाक्स फ़ाइल क्षेत्रों के साथ अपने रूप की धारा लोड करना चाहिए। जब आप ऐड बटन पर क्लिक करते हैं, तो यह फ़ाइल फ़ील्ड के आंशिक दृश्य का अनुरोध करता है, इसके पोस्ट डेटा में, मौजूदा आइटम्स की एक सूची। आंशिक दृश्य फिर एक अतिरिक्त क्षेत्र के साथ एक प्रस्तुत दृश्य देता है। यह सिर्फ एक विचार है। मैंने उस विचार को आजमाया या देखा नहीं है। मैं बस इसके बारे में और अनुमान लगाया कि मैं इसे साझा कर सकता हूं।

+0

मेरा प्रश्न केवल डेटा मॉडल बाध्यकारी के बारे में नहीं था, मुख्य प्रश्न जावास्क्रिप्ट –

+0

के साथ जोड़े गए इनपुट फ़ील्ड पर क्लाइंट साइड सत्यापन के बारे में था, मैंने समाधान के साथ दोनों प्रश्नों का उत्तर दिया लेकिन स्पष्टीकरण नहीं दिया। क्षमा करें, मैं अपनी पोस्ट संपादित कर रहा हूं। – Pluc

+0

एक बार और पढ़ने के बाद, मुझे एहसास हुआ कि मैं वास्तव में ट्रैक से बाहर था। मेरे सभी पोस्ट केवल आपके उप प्रश्न और सर्वर पक्ष सत्यापन का जवाब देते हैं। यह ग्राहक पक्ष को प्रभावित नहीं करता है। संपादन 2 मूल पोस्ट का उत्तर है। आपको अपने प्रश्न के शीर्षक में उचित शर्तों का उपयोग करना चाहिए। मॉडल प्रमाणीकरण सर्वर-साइड सत्यापन है। यही कारण है कि मैं उलझन में आया (लेकिन हाँ, मुझे भी पोस्ट पर अधिक ध्यान देना चाहिए था)। – Pluc

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