首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC 2、IModelBinder和ValueProvider的变化

MVC 2、IModelBinder和ValueProvider的变化
EN

Stack Overflow用户
提问于 2010-02-24 12:49:54
回答 2查看 2.4K关注 0票数 5

我正在尝试迁移到ASP.Net MVC 2,并遇到一些问题。这里有一个:作为视图发布的结果,我需要直接绑定一个字典

在ASP.Net MVC 1中,它使用自定义的IModelBinder完美地工作了:

代码语言:javascript
复制
/// <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不再是Dictionary<>了,它是一个只允许获取名称已知的值的IValueProvider

代码语言:javascript
复制
public interface IValueProvider
{
    bool ContainsPrefix(string prefix);
    ValueProviderResult GetValue(string key);
}

这真的不酷,因为我不能执行我的智能解析..。

问题:

  1. 还有另一种获取所有键的方法吗?
  2. ,您知道另一种将HTML元素集合绑定到字典

的方法吗?

谢谢你的建议

O。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-26 02:20:17

我不认为在MVC 2中您将不能再这样做了。

或者,您可以扩展DefaultModelBinder并覆盖它的一个虚拟方法(如GetModelProperties ),然后在ModelBindingContext中更改ModelName。另一种选择是为字典类型实现自定义MetadataProvider,您也可以在那里更改模型名。

票数 1
EN

Stack Overflow用户

发布于 2012-01-18 06:44:14

虽然这个问题已被标记为“答案”,但我认为以下几点可能会有所帮助。我也遇到了同样的问题,我看了一下System.Web.Mvc.DefaultValueProvider的源代码。它从RouteData、查询字符串或请求表单提交(按确切顺序)获取其值。为了收集所有的密钥(这是您在第一个问题中要求的),我编写了以下帮助方法。

代码语言:javascript
复制
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;
}

可以使用此方法对键进行枚举:

代码语言:javascript
复制
foreach (string key in GetKeys(controllerContext))
{
    // Do something with the key value.
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2326058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档