2

假设我有一个看起来像这样的 ASP.NET MVC 3 控制器

public class MyController : Contoller
{
    public ActionResult Edit(MyModel model)
    {
        /* doing some stuff with the model */
    }
}

模型看起来像这样

public class MyModel
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public ThatModel Property1 { get; set; }
    public List<ThisModel> BunchOfThisModel { get; set; }
}

public class ThatModel
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }
    public string Property4 { get; set; }
    public string Property5 { get; set; }
    public string Property6 { get; set; }
}

public class ThisModel
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

ASP.NET MVC 或 .NET(v4 可以,v4.5 不行)是否提供任何内置方法来编码模型(在这种情况下是 MyModel),以便可以将它作为表单 url 编码(又名x-www-form-urlencoded)?例如“property1=abc&property2=def”。但是,在将请求解码回模型时,ASP.NET MVC 有自己的方式来处理嵌套模型等。假设我正在使用自 .NET 1.1 以来提供的WebRequest / WebResponse API 模拟浏览器。

本质上,我想在测试中建立请求来验证

  1. 如果需要,通过绑定排除某些数据
  2. 如果需要,设置防伪令牌
  3. 恶意数据会得到相应处理

注意:现阶段未使用 ASP.NET Web API。因为我正在为现有应用程序编写(集成)测试,所以将模型作为 JSON、XML 或其他替代格式发送不适用于该问题。

4

1 回答 1

0

我希望我已经正确理解了这个问题,但是如果您正在“发布”该数据(来自 JSON?),那么它就能够使用最佳猜测过程来构建模型。

属性名称是匹配的,所以如果你发送(这里猜测重复的Property1实际上是Property3)

{
  Property1="this", 
  Property2="that", 
  Property3={Property1="this3", ....}, 
  BunchOfThisModel=[{Property1="bunchthis"},{....}]
}

这将使用匹配的任何名称填充您的 POCO。如果您遗漏了一个属性(即 Property2),它将具有它的default(T)价值。

在 GET 请求中发送对象模型会复杂得多,您可以对 JSON 字符串进行 base64 处理,然后在服务器上解析它,这是一种流行的方法,但鉴于它是一个复杂的模型,POST 可能最适合您的意图。

您还可以使用 CustomBinder(这里有一篇好文章)。您还可以通过使用BindAttributeExclude/Include 选项来控制哪些属性绑定到您的 POCO 对象。

希望我没有错过重点,这被证明是有用的:)

于 2012-06-08T11:47:04.880 回答