Использование типа значения в строго типизированном пользовательском элементе управления MVC view - PullRequest
4 голосов
/ 15 мая 2009

У меня есть пользовательский элемент управления MVC со следующей базовой структурой:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Decimal>" %>

<%= Math.Round(Model) %>

Что выдает это сообщение об ошибке, когда я его использую:

Сообщение об ошибке компилятора: CS0452: The тип «десятичный» должен быть ссылкой введите, чтобы использовать его в качестве параметра «TModel» в универсальном типе или методе 'System.Web.Mvc.ViewUserControl'

Есть ли способ заставить это работать (каким-то образом обманывая фреймворк в трактовку десятичного числа как ссылочного типа?) Или то, что я пытаюсь сделать, просто в корне неправильно?

Ответы [ 7 ]

8 голосов
/ 15 мая 2009

Я бы посоветовал вам обернуть тип значения в ViewModel. Это даст некоторую гибкость в будущем (что может или не может быть необходимо).

public class MyUserControlViewModel
{
    public Decimal MyValue { get; private set; }

    public MyUserControlViewModel(Decimal dec)
    {
        MyValue = dec;
    }
}


<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyUserControlViewModel>" %>

<%= Math.Round(Model.MyValue) %>
5 голосов
/ 15 декабря 2010

Не нужно переходить в класс, если вы хотите быстрый путь, используйте это

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Nullable<Decimal>>" %>

также вы можете рассмотреть вопрос об использовании

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>

и подтвердите код

3 голосов
/ 15 мая 2009

ViewUserControl объявляется следующим образом:

public class ViewUserControl<TModel> : ViewUserControl
where TModel : class

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

2 голосов
/ 15 мая 2009

Вы можете заключить значение в класс:

 public class Wrapper
{
        public Wrapper(decimal d)
        {
            this.Value = d;   
        }
        Decimal Value { get; set; }
}

В представлении:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Wrapper>" %>
<%= Math.Round(Model.Value) %>
1 голос
/ 15 мая 2009

Модель представляет собой DTO от контроллера до вида. Вы должны создать свой собственный DTO даже с одним десятичным свойством. Ответственность за представление заключается только в рендеринге, контроллер должен выполнять Math.Round.

0 голосов
/ 16 мая 2009

Хотя я решительно поддерживаю все ответы выше, заявив, что нужно обернуть десятичное значение в классе для поддержки дальнейшего развития, вы можете быстро решить свою проблему, сделав десятичное число обнуляемым («десятичное?»), Поскольку System.Nullable является ссылочным типом. .

0 голосов
/ 15 мая 2009

Я не очень знаком с ASP.Net MVC Framework, но ошибка в том, что ваша модель должна быть классом, а не примитивным типом, что довольно стандартно с точки зрения контроллера представления модели.

Чтобы это сработало, вам понадобится класс вроде:

class MyDouble : Model   // or whatever MVC calls it's Model
{
   public TheValue {
     get;
     set;
   }
}

и затем замените вашу строку на <%= Math.Round(Model.TheValue) %>.

Примечание. Кажется странным, что пользовательский элемент управления имеет двойное значение. Если это всего лишь пример приложения, тогда хорошо, но в противном случае вы можете пересмотреть, как наилучшим образом использовать пользовательские элементы управления.

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