Управляемый данными список числовых показателей в представлении, возвращаемом в виде строк

#c# #asp.net-mvc-4 #generics #razor

#c# #asp.net-mvc-4 #общие сведения #razor

Вопрос:

У меня есть список показателей в базе данных:

 Меры
ID DisplayOrder Name
------------------------------
1 3 Домашнее задание
2 2 Тест
3 1 Экзамен
4 4 SomeBigInt
... и т. д

Некоторые из этих мер представлены как Int s, некоторые — Double s.

Я пытаюсь найти способ извлечь все эти показатели из базы данных и отобразить их:

Модель

 namespace MyProj.BusinessRepository.BuisnessModels
{
    public interface IMeasure
    {
        Int32 Id { get; set; }
        String Name { get; set; }
        /// <summary>
        /// The position in which the measure should be displayed
        /// </summary>
        Int32 DisplayOrder { get; set; }
    }

    public class ScoreMeasure<T> : IMeasure
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int DisplayOrder { get; set; }
        public T Adjustment { get; set; }
        public T BaseValue { get; set; }
    }

    public class AdminMeasure<T> : IMeasure
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int DisplayOrder { get; set; }
        public T Weight { get; set; }
    }
}
 

Который я затем использую внутри родительской модели в виде списка (который завернут в ViewModel).

После прочтения различных других вопросов по SO, похоже, что единственный способ сделать это (учитывая несколько типов) — это a List<ScoreMeasure<Object>> .

Вид

     for(var i=0; i < Model.ScoreCard.Measures.Count; i  )
    {
        @Html.HiddenFor(m=>m.ScoreCard.Measures[i].Name)
        @f.FormGroup().TextBoxFor(m => m.ScoreCard.Measures[i].Adjustment).Append("%").Label().LabelText(Model.ScoreCard.Measures[i].Name)
    }
 

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

Есть ли более разумный способ распознать их как числа? Как есть, ненавязчивая проверка не применяет числовое ограничение, и я должен проанализировать их, когда они вернутся (не уверен, как я собираюсь определить, какие из них являются Int или Double, кроме, возможно, поиска десятичной точки, которая может быть удалена пользователем)?

ETA: Пусть вас не смущают странные @f.formGroup() вещи в представлении, это TwitterBootstrapMVC — по сути, это обертывание a @Html.TextBoxFor .

Комментарии:

1. Таким T образом, может представлять int или decimal ? Есть ли какая-либо причина, по которой вы не можете просто использовать decimal для представления чисел, и ваши модели сообщают MVC, какой шаблон использовать для его отображения?

2. @Justin Моя главная забота о том, чтобы просто сделать их все Double , — это ошибки округления / точности и другая «забавная» математика, которая может возникнуть. ETA: Не могли бы вы показать пример того, что вы имеете в виду, когда модели указывают MVC, какой шаблон использовать для рендеринга?

3. Джастин сказал, что десятичный, а не двойной, десятичный более точный.

4. Я полагаю, это сработало бы! Оглядываясь назад, чувствую себя глупо спрашивать. @Justin, все еще интересно услышать, как вы могли бы заставить MVC определить правильный способ его отображения — isInteger я полагаю, просто такой флаг? Или 3-й класс, подобный IntScoreMeasure ?

Ответ №1:

Чтобы ответить на ваш вопрос о том, как форматировать значение, вы можете украсить свою модель DisplayFormat атрибутом. Это используется в сочетании с методом Html.DisplayFor or @Html.DisplayForModel для его отображения.

 public class MyModel
{
    [DisplayFormat(DataFormatString = "{0:n0}" ,ApplyFormatInEditMode = true)]
    public decimal IntValue { get; set; }

    public decimal DecimalValue { get; set; }
}
 

Использование инициализатора объекта var model = new MyModel {DecimalValue = 2.546m, IntValue = 245.110m}; показывает, что они являются десятичными, но методы DisplayFor and EditorFor теперь отформатируют его, чтобы он отображался как int для пользователя.

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