سؤال

أحاول الهجرة إلى ASP.NET MVC 2 وتلبية بعض القضايا. هنا واحد: كنت بحاجة لربط مباشرة أ قاموس نتيجة لنشر عرض.

في ASP.NET MVC 1 عملت بشكل مثالي باستخدام العرف imodelbinder :

/// <summary>
/// Bind Dictionary<int, int>
/// 
/// convention : <elm name="modelName_key" value="value"></elm>
/// </summary>
public class DictionaryModelBinder : IModelBinder
{
    #region IModelBinder Members

    /// <summary>
    /// Mandatory
    /// </summary>
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        IDictionary<int, int> retour = new Dictionary<int, int>();

        // get the values
        var values = bindingContext.ValueProvider;
        // get the model name
        string modelname = bindingContext.ModelName + '_';
        int skip = modelname.Length;

        // loop on the keys
        foreach(string keyStr in values.Keys)
        {
            // if an element has been identified
            if(keyStr.StartsWith(modelname))
            {
                // get that key
                int key;
                if(Int32.TryParse(keyStr.Substring(skip), out key))
                {
                    int value;
                    if(Int32.TryParse(values[keyStr].AttemptedValue, out value))
                        retour.Add(key, value);
                }
            }
        }
        return retour;
    }

    #endregion
}

لقد عملت في زوج مع بعض HTMLBuilder الذكية التي عرضت قاموس البيانات.

المشكلة التي قابلتها الآن هي ذلك Valueprovider لم يعد هناك قاموس <>

public interface IValueProvider
{
    bool ContainsPrefix(string prefix);
    ValueProviderResult GetValue(string key);
}

هذا ليس رائعًا حقًا لأنني لا أستطيع أداء التحليل الذكي الخاص بي ...

سؤال :

  1. هل هناك طريقة أخرى للحصول على جميع المفاتيح؟
  2. هل تعرف طريقة أخرى لربط مجموعة من عناصر HTML بقاموس

شكرا لاقتراحاتك

أ

هل كانت مفيدة؟

المحلول

لا أعتقد أنك ستتمكن من القيام بذلك بهذه الطريقة في MVC 2.
بدلاً من ذلك ، يمكنك تمديد DefaultModelBinder وتجاوز إحدى أساليبها الافتراضية مثل getModelProperties ثم تغيير اسم النموذج داخل modelBindingContext. هناك خيار آخر هو تنفيذ Metadataprovider مخصص لنوع القاموس الخاص بك ، يمكنك تغيير اسم النموذج هناك أيضًا.

نصائح أخرى

على الرغم من أن هذا السؤال قد تم تمييزه "الإجابة" ، أعتقد أن ما يلي قد يكون مفيدًا. واجهت نفس المشكلة وألقيت نظرة على الكود المصدري للنظام. تحصل على قيمها من Routedata أو سلسلة الاستعلام أو من تقديم نموذج الطلب (بهذا الترتيب الدقيق). لجمع جميع المفاتيح (وهو ما تطلبه في سؤالك الأول) كتبت طريقة المساعد التالية.

private static IEnumerable<string> GetKeys(ControllerContext context)
{
    List<string> keys = new List<string>();
    HttpRequestBase request = context.HttpContext.Request;
    keys.AddRange(((IDictionary<string,
        object>)context.RouteData.Values).Keys.Cast<string>());
    keys.AddRange(request.QueryString.Keys.Cast<string>());
    keys.AddRange(request.Form.Keys.Cast<string>());
    return keys;
}

يمكنك استخدام هذه الطريقة للتعداد على المفاتيح:

foreach (string key in GetKeys(controllerContext))
{
    // Do something with the key value.
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top