Хорошо, я знаю, что это не прямой ответ на ваш вопрос, но в любом случае это может быть лучший способ сделать большинство входных данных (и это было забавно сделать).Я только что закончил это и провел небольшое тестирование, поэтому я не могу ручаться за то, что это идеально в каждой ситуации.
Я получил эту идею из поста Джимми Богарда здесь .Взгляните, потому что там есть куча действительно классных идей.
Я создал помощника "InputFor", который изо всех сил старается определить, какой ввод вы запрашиваете, и вывести его соответствующим образом.Это сделает переключатели, но по умолчанию будет отображаться выпадающий список, если их больше двух, вы сможете довольно легко изменить эту функцию.
Приведенный ниже код позволяет вам совершать звонки, например <%= Html.InputFor(m => m.Gender) %>
или <%Html.InputFor(m => m.Gender, Model.GenderList)%>
.В конце есть небольшой класс, который позволяет вам делать кодирование по соглашению, но мы вернемся к этому позже.
public static MvcHtmlString InputFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, object>> field, Dictionary<string, string> listing) where TModel : class
{
string property_name = GetInputName(field);
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(helper.ViewData.Model).Find(property_name, true);
string property_type = descriptor.PropertyType.Name;
var func = field.Compile();
var value = func(helper.ViewData.Model);
//Add hidden element if required
if (descriptor.Attributes.Contains(new HiddenInputAttribute()))
{
return helper.Hidden(property_name, value);
}
if (property_type == "DateTime" || property_type == "Date")
{
return helper.TextBox(property_name, value, new { @class = "date_picker" });
}
if (listing != null)
{
if (listing.Count <= 2)
{
//This is a good length for a radio button
string output = "";
foreach (KeyValuePair<string, string> pair in listing)
{
TagBuilder label = new TagBuilder("label");
label.MergeAttribute("for", property_name);
label.SetInnerText(pair.Value);
output += helper.RadioButton(property_name, pair.Key, (value == pair.Key)).ToHtmlString();
output += label.ToString();
}
return MvcHtmlString.Create(output);
}
else
{
//too big for a radio button, lets make a drop down
return helper.DropDownList(property_name, new SelectList(listing, "Key", "Value"), value);
}
}
else
{
if (property_type == "Boolean")
{
listing = new Dictionary<string, string>();
listing.Add("true", "Yes");
listing.Add("false", "No");
SelectList select_values = new SelectList(listing, "Key", "Value", ((bool)value ? "Yes" : "No"));
return helper.DropDownList(property_name, select_values);
}
return helper.TextBox(property_name, value);
}
}
Кодирование по соглашению
Приведенный ниже код позволяет этобыть сделано с соглашением по конфигурации в виду.Например, если у вас есть объект модели, который содержит свойство, которое вы хотите перечислить (Gender), и словарь с тем же именем, но с добавлением «List» (GenderList), он будет использовать этот список по умолчанию.
например, <%= Html.InputFor(m => m.Gender) %>
может составить полный выпадающий список / группу переключателей, но эти значения по умолчанию можно переопределить, сделав такой вызов, как <%= Html.InputFor(m => m.Gender, alternate_list) %>
public static MvcHtmlString InputFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, object>> field) where TModel : class
{
string property_name = GetInputName(field) + "List";
PropertyDescriptor list_descriptor = TypeDescriptor.GetProperties(helper.ViewData.Model).Find(property_name, true);
Dictionary<string, string> listing = null;
if (list_descriptor != null)
{
//Found a match for PropertyNameList, try to pull it out so we can use it
PropertyInfo temp = helper.ViewData.Model.GetType().GetProperty(property_name);
listing = (Dictionary<string, string>)temp.GetValue(helper.ViewData.Model, null);
}
return InputFor(helper, field, listing);
}
Теперь небольшой отказ от ответственности:
- Это не самый быстрый код в мире (из-за размышлений и прочего), в моей ситуации это не очень актуально, так как все зависит от пользователя, если вы планируете что-то делатьсумасшедший глупец.
- Этот код находится в зачаточном состоянии, я буду более тщательно его тестировать и добавлять в него в течение следующих нескольких дней, и буду рад любым предложениям по улучшению кода.
Я надеюсь, что этот код будет полезен для кого-то, я знаю, что буду использовать его в течение следующих нескольких недель, чтобы попытаться сократить время.Сокращение этого, чтобы просто сделать радио-кнопку должно быть тривиальной задачей, удачи:)
Jay