【问题标题】:Simplest Way To Do Dynamic View Models in ASP.NET MVC 3在 ASP.NET MVC 3 中执行动态视图模型的最简单方法
【发布时间】:2010-09-21 08:44:25
【问题描述】:

警告:这可能是对 C# 动态关键字的不当使用,我可能应该使用强类型视图模型,但是...

我试图通过将 C# 4 动态类型传递给我的视图来避免创建强类型视图模型。我的控制器中有这个:

    public ActionResult Index()
    {
        var query =
            from fr in db.ForecastRates
            join c in db.Codes
            on 
                new { Code = fr.RateCode, CodeType = "ForecastRate" }
            equals 
                new { Code = c.CodeValue, CodeType = c.CodeType }
            select new
            {
                RateCode = fr.RateCode,
                RateCodeName = c.CodeName,
                Year = fr.Year,
                Rate = fr.Rate,
                Comment = fr.Comment
            };

        // Create a list of dynamic objects to form the view model
        // that has prettified rate code
        var forecastRates = new List<dynamic>();

        foreach (var fr in query)
        {
            dynamic f = new ExpandoObject();

            f.RateCode = fr.RateCode;
            f.RateCodeName = fr.RateCodeName;
            f.Year = fr.Year;
            f.Rate = fr.Rate;
            f.Comment = fr.Comment;

            forecastRates.Add(f);
        }

        return View(forecastRates);
    }

...在我看来(我正在使用 MVC 3 的 Razor 视图引擎):

        @inherits System.Web.Mvc.WebViewPage<IEnumerable<dynamic>>

        ...

        <tbody>
            @foreach (var item in Model) {
            <tr>
                <td>@item.RateCodeName</td>
                <td>@item.Year</td>                            
                <td>@item.Rate</td>
                <td>@item.Comment</td>
            </tr>
            }
        </tbody>

我不喜欢遍历 LINQ 结果以形成动态对象列表的方式。

我想在 LINQ 查询中初始化每个 ExpandoObject,但 that doesn't seem to be supported

我尝试将查询结果转换为 List,但这不起作用,因为您无法将匿名类型转换为动态。

【问题讨论】:

  • 您不喜欢迭代方式的哪些方面?为什么要避免使用强类型视图模型?哦,你肯定可以从匿名类型转换为动态类型,所以我不确定你的最后一点是想说什么......你是在谈论List&lt;T&gt; 中缺乏差异吗? ?
  • 我只是不想迭代以保持它有点干燥(想在 LINQ 查询中完成所有操作)。我想避免使用强类型视图模型,而是使用动态视图模型,因为我不想重复模型中的内容(并且因为我是一名想成为 Ruby 开发人员的 C# 开发人员:)。不过,也许我可以将模型子类化以形成视图模型?是的,我想将查询结果转换为 List (这可能吗?)。谢谢!
  • 看看“粘土”。请参阅我对上一个问题的回答:stackoverflow.com/questions/3758157/…

标签: linq dynamic asp.net-mvc-3


【解决方案1】:

如您所说,不支持。 (我不是说不支持动态视图模型 - 我是说你想要做的不是)

您可能可以整理 LINQ 查询,但最终您最好的选择是简单地创建一个自定义视图模型。说真的,这需要大约 30 秒。

我知道动态是新的和很酷的东西,但是如果你在这种情况下坚持使用自定义视图模型,你的代码会更整洁,更容易维护。

我只会在非常简单的场景中使用动态视图模型 - 大多数时候你可能想要坚持我们一直在做的事情 - 自定义视图模型。

【讨论】:

    【解决方案2】:

    好的,您可以执行以下操作,但我不建议这样做。创建一个类似于下面的静态方法

    public static IHtmlString DisplayProperty(object obj, string property) {
        return new HtmlString(TypeDescriptor.GetProperties(obj)[property].GetValue(obj).ToString());
    }
    

    然后在您的 cshtml 文件中进行以下调用(确保使用正确的命名空间)

    <tbody>
        @foreach (var item in Model) {
        <tr>
            <td>@DisplayProperty(x, "RateCodeName")</td>
            <td>@DisplayProperty(x, "Year")</td>                            
            <td>@DisplayProperty(x, "Rate")</td>
            <td>>@DisplayProperty(x, "Comment")</td>
        </tr>
        }
    </tbody>
    

    虽然我不建议这样做,但它是您的问题的解决方案,不需要模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2011-10-24
      • 2023-03-06
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      相关资源
      最近更新 更多