ASP.NET MVC:如果你的模型只是一个字典怎么办?

时间:2010-02-04 05:17:09

标签: asp.net-mvc

(我是MVC的新手)。

在我的应用程序中,我没有具有属性的类意义上的模型。哦,不,它更简单:我的用户基本上为系统中其他地方的各种键设置填写了一串字符串值(键是任意的,提前不知道,因此没有预编码类) 1

我的“模特”因此只是:

Dictionary<string, string>

非常简单。

据我所知,模型绑定,html助手,模型状态,验证摘要都依赖于任意类'属性的反射。但他们可以只使用我字典中的键/值吗?

例如,我可以:

<label for="Name">Name:</label>
<%= Html.TextBox("Name") %>
<%= Html.ValidationMessage("Name", "*") %>

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Dictionary<string, string> valuesEntered)
{            
    // ...
}

并让MVC使用我"Name"“模型中的Dictionary<string, string>键/值来完成其所有的幕后魔术? (MVC 1.0最好,但如果我在2.0中更好地解决这个问题,请详细说明一下吗?)


1:听起来很傻我很确定。它适用于报告应用,其中“键”是报告参数名称,“值”是报告将运行的值。

6 个答案:

答案 0 :(得分:4)

MVC 1.0中的默认模型绑定器可以绑定到字典,只要它使用魔术表单字段标识符'dictionaryName [index] .key'和'dictionaryName [index] .value',其中dictionaryName是你的名字字典参数,索引是 0的序号。通常,“键”值将是隐藏字段,“值”值是您的文本字段。在您的示例中:

<%= Html.Hidden("valuesEntered[0].key", "Name") %>
<%= Html.TextBox("valuesEntered[0].value") %>
<%= Html.ValidationMessage("valuesEntered[0].value", "*") %>

据我了解,在MVC 2中绑定到词典是不同的。

答案 1 :(得分:0)

确实,模型可以像名称/值对的集合一样简单。你可以沿着这条路走下去,但我建议至少将你的词典包装在一个班级中,并至少使用属性或吸气剂来让你自己有一些灵活性。

是的,您可以绑定集合,但仅限于列表/网格/组合框类型方案。例如。用于保存集合的UI控件。您无法真正使用反射来任意绑定到集合中的给定值。

编辑:我认为标签/文本框不适合您的方案。尝试网格或列表。

答案 2 :(得分:0)

我建议为报表名称 - 值对创建一个模型,然后使用this中概述的方法(请参阅BeginCollectionItem html帮助器讨论)来实现绑定这些方法的集合。

然后可以根据需要将验证插入到名称 - 值对模型中,具体取决于特定实例的规则。

答案 3 :(得分:0)

根据ASP.NET MVC架构,您需要执行以下步骤:

  1. 创建自己的活页夹(我发现here

    的合适示例
    public class DefaultDictionaryBinder : DefaultModelBinder  
    {  
        //...  
    }
    
  2. Application_Start

    中替换默认活页夹
    ModelBinders.Binders.DefaultBinder = new DefaultDictionaryBinder();
    
  3. 创建操作过滤器

    public class DictionaryFilter : ActionFilterAttribute  
    {  
        public override void OnActionExecuting(ActionExecutingContext filterContext)  
        {  
            // Process filterContext.HttpContext.Request.InputStream here  
        }    
        //...  
    }
    
  4. 现在将过滤器应用于您的操作

    [DictionaryFilter]  
    [AcceptVerbs(HttpVerbs.Post)]  
    public ActionResult Create(Dictionary<string, string> valuesEntered)  
    {  
        //...  
    }  
    
  5. 享受你的工作: - )

答案 4 :(得分:0)

创建自定义模型绑定器是一个很好的建议,但是,我看到使用Dictionary提供值的一个大问题:基于字典的模型如何获取键?根据您的评论,您计划为控件指定与键相同的名称。那么,如果您已经知道密钥的名称,为什么要经历创建字典的麻烦?

您可以通过创建一个ViewModel对象来完成相同的结果,该对象包含您将用于报表的所有参数作为属性。填充您需要的值,忽略您不需要的值。

例如:

public class ReportParameterViewModel
{
    public DateTime OrderRangeBegin { get; set; }
    public DateTime OrderRangeEnd { get; set; }
    public string Department { get; set; }
    public int Customer_Number { get; set; }
    public double Commission_Rate { get; set; }
    public int Page_Start { get; set; }
    public int Page_End { get; set; }
    public bool IsExecutiveVersion { get; set; }
    //
    // ...and so on...
    //
}

确保负责生成报告的所有控制器操作方法都可以接受ReportParameterViewModel的实例,并确保所有报告视图都从ReportParameterViewModel继承。鉴于您的报告的观点可能是静态的,因此字典的想法听起来似乎比必要的工作更多。

答案 5 :(得分:0)

另一种替代方法可能是使用键作为字段名称循环字典以生成字段。在这种情况下,标签可能必须从另一个位置拉出。

在发布表单之前,使用jquery.form.js将发布的数据组合回字典的json字符串表示,然后使用JavaScriptSerializer将json strin转换为字典。也许,甚至支持自动执行此操作。

对于验证,您还可以切换到客户端验证,例如使用jquery.validate.js并自动构建java scipt。