Самый простой способ сделать модели с динамическим представлением в ASP.NET MVC 3 - PullRequest
2 голосов
/ 21 сентября 2010

Предостережение : Это может быть неправильное использование динамического ключевого слова в 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);
    }

... и это на мой взгляд (я использую движок представления Razor MVC 3):

        @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 для формирования списка динамических объектов.

Я хотел бы инициализировать каждый ExpandoObject внутри запроса LINQ, но , который, кажется, не поддерживается .

Я попытался привести результат запроса к списку, но это не сработало, потому что вы не можете преобразовать анонимный тип в динамический.

Ответы [ 2 ]

4 голосов
/ 22 сентября 2010

Как вы сказали, не поддерживается .(Я не говорю, что динамические модели просмотра не поддерживаются - я говорю, что вы пытаетесь это сделать не так)

Возможно, вы могли бы обновить запрос LINQ, но, в конце концов, ваш лучший выборбыло бы просто создать пользовательскую модель представления.Серьезно, вам понадобится около 30 секунд, чтобы сделать это.

Я знаю, что динамический - это новое и классное и все такое, но ваш код будет намного удобнее и проще в обслуживании, если вы просто придерживаетесь пользовательской модели представленияв этом случае.

Я бы использовал динамическую модель представления только в очень простых сценариях - большую часть времени вы, вероятно, захотите придерживаться того, что мы делали все время, - пользовательских моделей представления.

0 голосов
/ 21 сентября 2010

Хорошо, вы могли бы сделать следующее, но я бы не рекомендовал это.Создайте статический метод, подобный следующему

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>

Я бы не рекомендовал этохотя, но это решение вашей проблемы, которое не требует модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...