代码之家  ›  专栏  ›  技术社区  ›  mathieu

htmlhelp使用ServiceLocator构建dropdownlist:代码气味?

  •  2
  • mathieu  · 技术社区  · 14 年前

    考虑到下面的代码(高度简化以直截了当),必须遵循以下模式是一种代码味道吗?

    class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Category Cat { get; set; }
    }
    
    class Category
    {
        public int Id { get; set; }
        public string Label { get; set; }
    }
    

    编辑产品的视图:

    <% =Html.EditorFor( x => x.Name ) %>
    <% =Html.EditorFor( x => x.Category ) %>
    

    <% =Html.DropDownList<Category>() %>
    

    HtmlHelper方法

    public static MvcHtmlString DropDownList<TEntity>(this HtmlHelper helper)
        where TEntity : Entity
    {
        var selectList = new SelectList(
            ServiceLocator.GetInstance<SomethingGivingMe<TEntity>>().GetAll(), 
            "Id", "Label");
    
        return SelectExtensions.DropDownList(helper, "List", selectList, null, null);
    }
    

    作为参考,helper方法的实际实现需要一些lambda来获取DataTextField和DataValueField名称、所选值等。

    所以我认为我使用的解决方案更简单,因为helper方法是通用的(modelbinder也是通用的,这里不包括)。所以我只需要为每个需要DropDownList的类型创建一个EditorTemplate。

    有什么建议吗?

    2 回复  |  直到 14 年前
        1
  •  0
  •   John Farrell    14 年前

    我想我会保持原样,在另一个项目中也有同样的东西。

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        foreach( var anticipated in SomeDetectionMethod() )
        {
              var selectList = new SelectList(
        ServiceLocator.GetInstance<SomethingGivingMe<TEntity>>().GetAll(), 
        "Id", "Label");
    
             ViewData["SelectList." + anticipated.Label/Name/Description"] = selectList;
        }
    }
    

    在视图中,您可以创建一个助手,通过自定义编辑器模板或其他方法加载这些下拉列表。

        2
  •  -1
  •   Omu    14 年前

    建议:从这里查看asp.net mvc示例应用程序: http://valueinjecter.codeplex.com/ 祝你好运;)

    (但现在不行,因为我对解决问题没意见)

    public class CountryToLookup : LoopValueInjection<Country, object>
    {
        ICountryRepo _repo;
    
        public CountryToLookup(ICountryRepository repo)
        {
            _repo = repo;
        }
    
        protected override object SetValue(Country sourcePropertyValue)
        {
            var value = sourcePropertyValue ?? new Country();
            var countries = _repo.GetAll().ToArray();
            return
                countries.Select(
                    o => new SelectListItem
                             {
                                 Text = o.Name,
                                 Value = o.Id.ToString(),
                                 Selected = value.Id == o.Id
                             });
        }
    }