2011-04-01 18 views
5

रिमोट सत्यापन ठीक काम करता है जब मुझे दृश्य पर मेरे मॉडल का केवल एक उदाहरण मिलता है।मॉडलों के संग्रह पर अतिरिक्त फ़ील्ड के साथ रिमोट सत्यापन

समस्या तब होती है जब मेरा विचार मॉडल के संग्रह से निपट रहा है।

public class TableFormTestModel 
{ 
    public GridRow[] GridData { get; set; } 
    public class GridRow 
    { 
     public Int32 Id { get; set; } 

     [Required, StringLength(50), Remote("IsNameAvailable", "TableFormTest", "Admin", AdditionalFields = "Id")] 
     public String Name { get; set; } 
    } 
} 

मेरी नजर में मुझे मिल गया है: यहाँ मेरी मॉडल है

@model TableFormTestModel 
@using (Html.BeginForm()) 
{ 
    Html.EnableClientValidation(); 
    Html.EnableUnobtrusiveJavaScript(); 
    for(var i = 0;i<Model.GridData.Length;i++) 
    { 
    <div> 
     @Html.HiddenFor(x => Model.GridData[i].Id) 
     @Html.TextBoxFor(x => Model.GridData[i].Name) 
     @Html.ValidationMessageFor(x => Model.GridData[i].Name)  
    </div> 
    } 
} 

यह काफी प्रपत्र पैदा करने में एक लंबा रास्ता है, किसी को भी मेरे लिए वाक्य रचना में सुधार कर सकते हैं?

निम्न HTML प्रपत्र उत्पादन किया जाता है:

<form method="post" action="/Admin/TableFormTest/"> <div> 
    <input type="hidden" value="1" name="GridData[0].Id" id="GridData_0__Id" data-val-required="The Id field is required." data-val-number="The field Id must be a number." data-val="true"> 
    <input type="text" value="abc" name="GridData[0].Name" id="GridData_0__Name" data-val-required="The Name field is required." data-val-remote-url="/Admin/TableFormTest/IsNameAvailable" data-val-remote-additionalfields="*.Name,*.Id" data-val-remote="&amp;#39;Name&amp;#39; is invalid." data-val-length-max="50" data-val-length="The field Name must be a string with a maximum length of 50." data-val="true"> 
    <span data-valmsg-replace="true" data-valmsg-for="GridData[0].Name" class="field-validation-valid"></span>  
</div> 
<div> 
    <input type="hidden" value="2" name="GridData[1].Id" id="GridData_1__Id" data-val-required="The Id field is required." data-val-number="The field Id must be a number." data-val="true"> 
    <input type="text" value="def" name="GridData[1].Name" id="GridData_1__Name" data-val-required="The Name field is required." data-val-remote-url="/Admin/TableFormTest/IsNameAvailable" data-val-remote-additionalfields="*.Name,*.Id" data-val-remote="&amp;#39;Name&amp;#39; is invalid." data-val-length-max="50" data-val-length="The field Name must be a string with a maximum length of 50." data-val="true"> 
    <span data-valmsg-replace="true" data-valmsg-for="GridData[1].Name" class="field-validation-valid"></span>  
</div> 

हालांकि उपरोक्त एचटीएमएल काफी अच्छी तरह से (संग्रह से प्रत्येक मॉडल विशिष्ट आईडी और नाम मिल गया है) वहाँ दूरदराज के सत्यापन पर अतिरिक्त फ़ील्ड के साथ एक समस्या है लग रहा है :

data-val-remote-additionalfields="*.Name,*.Id" 

पहली पंक्ति से आईडी दूसरी पंक्ति पर दूरस्थ सत्यापन को निकाल दिया जाता है जब उठाया जाता है।

+0

प्रदर्शन टेम्पलेट्स और फिर @Html का उपयोग करने का प्रयास करें।DisplayFor (मॉडल => मॉडल। ग्रिडडाटा) – mimo

उत्तर

1

सबसे पहले, हाँ, आप अपने विचार के वाक्यविन्यास में सुधार कर सकते हैं। संपादक टेम्पलेट्स का उपयोग करें।

Views\Shared\EditorTemplates\GridRow.cshtml बनाएँ:

@model TestMvc.Models.TableFormTestModel.GridRow 
<div> 
    @Html.HiddenFor(x => x.Id) 
    @Html.TextBoxFor(x => x.Name) 
    @Html.ValidationMessageFor(x => x.Name) 
</div> 

अब आप अपने मुख्य दृश्य केवल होने की जरूरत है:

@model TableFormTestModel 
@using (Html.BeginForm()) 
{ 
    Html.EnableClientValidation(); 
    Html.EnableUnobtrusiveJavaScript(); 
    @Html.EditorFor(x => x.GridData) 
} 

RemoteAttribute मुसीबतों का सवाल है, यह मुश्किल है। समस्या उन इनपुट के नामों के कारण है जो एमवीसी सरणी के लिए बनाता है। जैसा कि आप देख सकते हैं, आपके इनपुट का नाम है, उदाहरण के लिए, GridData[1].Id, GridData[1].Name (आदि)। खैर, jQuery क्वेरीजिंग में उन नामों की आपूर्ति करके अपने AJAX कॉल बनाता है।

इस प्रकार, क्या समाप्त होता है कहा जाता हो रही

/Admin/TableFormTest/IsNameAvailable?GridData%5B1%5D.Name=sdf&GridData%5B1%5D.Id=5 

/Admin/TableFormTest/IsNameAvailable?GridData[1].Name=sdf&GridData[1].Id=5 

उर्फ ​​है ... और डिफ़ॉल्ट मॉडल बांधने की मशीन वास्तव में क्या है कि के साथ क्या करना नहीं जानता है।

मेरा सुझाव है कि आप अपना खुद का कस्टम मॉडल बाइंडर लिखें। एमवीसी को बताएं कि इस क्वेरी स्ट्रिंग को कैसे पढ़ा जाए और उसके बाद इच्छित ऑब्जेक्ट बनाएं।

यहां एक सबूत-अवधारणा है।

public class JsonGridRowModelBinder : IModelBinder { 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     var model = new TableFormTestModel.GridRow(); 
     var queryString = controllerContext.HttpContext.Request.QueryString; 
     model.Name = queryString[queryString.AllKeys.Single(x => x.EndsWith("Name"))]; 
     string id = queryString[queryString.AllKeys.Single(x => x.EndsWith("Id"))]; 
     model.Id = string.IsNullOrWhiteSpace(id) ? 0 : int.Parse(id); 

     return model; 
    } 

} 

फिर, इस मॉडल बांधने की मशीन का उपयोग करने के अपने IsNameAvailable विधि बता: (यह भी कई मान्यताओं ले जाता है और दुर्घटना और कुछ भी अप्रत्याशित पर जला होगा लेकिन उत्पादन में इस बात का उपयोग न करें।):

public JsonResult IsNameAvailable([ModelBinder(typeof(JsonGridRowModelBinder))] TableFormTestModel.GridRow gridRow) { 
    ... 
} 
संबंधित मुद्दे