2012-12-10 10 views
18

मैं स्टीव सैंडर्सन BeginCollectionItem एक्सटेंशन का उपयोग कर रहा हूं ताकि वस्तुओं की बाध्यकारी सूचियों में मदद मिल सके। यह आदिम प्रकार के लिए ठीक काम करता है। मेरी समस्या यह है कि मैंने जो कस्टम मॉडल बाइंडर लिखा है, उसके लिए मैं नहीं देख सकता कि आइटम का पूरा नाम और अनुक्रमणिका कैसे उत्पन्न करें, जिसके लिए मैं बाध्यकारी हूं।स्टीव सैंडर्सन्स के साथ मॉडल बाइंडिंग BeginCollectionItem

वर्तमान में अपने मॉडल बांधने की मशीन इस तरह दिखता है:

public class MoneyModelBinder : DefaultModelBinder 
{ 
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Amount"); 

     if (valueResult != null) 
     { 
      var value = valueResult.AttemptedValue; 
      var currencyCode = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Iso3LetterCode").AttemptedValue; 

      var money = (Money) bindingContext.Model; 

      Money parsedValue; 
      if (String.IsNullOrEmpty(value)) 
      { 
       money.Amount = null; 
       return; 
      } 

      var currency = Currency.FromIso3LetterCode(currencyCode); 

      if (!Money.TryParse(value, currency, out parsedValue)) 
      { 
       bindingContext.ModelState.AddModelError("Amount", string.Format("Unable to parse {0} as money", value)); 
      } 
      else 
      { 
       money.Amount = parsedValue.Amount; 
       money.Currency = parsedValue.Currency; 
      } 
     } 
     else 
     { 
      base.OnModelUpdated(controllerContext, bindingContext); 
     } 
    } 
} 

मेरे ViewModel इस तरह Lokks (कुछ propertis स्पष्टता के लिए छोड़े गए):

public class EditFeeEarningCapacityViewModel 
{ 

    public List<FeeEarner> FeeEarners { get; set; } 

    public class FeeEarner 
    { 
     public Money AverageChargeOutRate { get; set; } 
    } 
} 

मेरे टेम्पलेट संपादन मनी प्रकार के लिए इस तरह दिखता है:

@model Core.Money 
@{ 
    int decimalPlaces; 
    if(!int.TryParse(string.Format("{0}", ViewData["DecimalPlaces"]), out decimalPlaces)) 
    { 
     decimalPlaces = 0; 
    } 
} 
<div class="input-prepend"> 
    <span class="add-on">@Model.Currency.Symbol</span>@Html.TextBoxFor(m => m.Amount, 
                   new 
                   { 
                    placeholder = string.Format("{0}", Model.Currency), 
                    @class = "input-mini", 
                    Value = String.Format("{0:n" + decimalPlaces + "}", Model.Amount) 
                   }) 
</div> 
@Html.HiddenFor(x => x.Iso3LetterCode) 

एक रूप इस तरह पद मानों के लिए:

FeeEarners.index 3fa91d09-0617-4bea-ae3f-d84862be8c04 

FeeEarners[3fa91d09-0617-4bea-ae3f-d84862be8c04].feeEarner.AverageChargeOutRate.Amount 500 
FeeEarners[3fa91d09-0617-4bea-ae3f-d84862be8c04].feeEarner.AverageChargeOutRate.Iso3LetterCode GBP 

मैं नहीं देख सकता कि आइटम या उस संपत्ति के नाम का पता लगाने के लिए कैसे मैं बाध्यकारी हूं। तो अनिवार्य रूप से, मैं उस आइटम की अनुक्रमणिका कैसे ढूंढूं जिसे मैं बांधने की कोशिश कर रहा हूं और उस संपत्ति का नाम जिसे मैं डेटा से बांधने की कोशिश कर रहा हूं?

+0

@ स्टीवन-सैंडरसन आप के रूप में वह एक सदस्य :) है स्टीव इस को देखने के लिए मिलना चाहिए बनाने – MikeD

उत्तर

1

मैं उस सहायक के साथ नहीं हूं लेकिन संग्रह के लिए मैं थोड़ा अलग चाल कर रहा हूं।

कुंजी निर्धारित

var key = "EditModel[{0}].{1}"; 

वर सूचकांक = 0;

तो प्रपत्र

foreach(var fee in Model.FeeEarners){ 
    @Html.TextBox(string.Format(key, index, "PropertyNameFromYourFeeClass")); 
//It will build text box and set value 
} 

नियंत्रक तरफ निर्माण इनपुट पैरामीटर के साथ कार्रवाई

public ActionResult Save(EditFeeEarningCapacityViewModel editModel){ 
...your code here 
} 
संबंधित मुद्दे