#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
использовать созданные вами шаблоны для его отображения.