. , . html. ViewModels, , , , .
, , EditorTemplate.
() ViewModel, :
public class SelectModel
{
#region SelectModel(string value, IEnumerable<SelectListItem> items)
public SelectModel(string value, IEnumerable<SelectListItem> items)
{
_value = value;
Items = new List<SelectListItem>(items);
_Select();
}
#endregion
public List<SelectListItem> Items { get; private set; }
public string Value
{
get { return _value; }
set { _value = value; _Select();}
}
private string _value;
private void _Select()
{
Items.ForEach(x => x.Selected = (Value != null && x.Value == Value));
}
}
, , ( , ?):
public class EmailModel
{
public EmailModel()
{
Priority = new SelectModel("normal", _ToPrioritySelectItems());
}
public SelectModel Priority { get; set; }
private IEnumerable<SelectListItem> _ToPrioritySelectItems()
{
List<SelectListItem> result = new List<SelectListItem>();
result.Add(new SelectListItem() { Text = "High", Value = "high" });
...
}
, . , ViewModel.
SelectModel.ascx Shared/EditorTemplates
<%@ Control Inherits="System.Web.Mvc.ViewUserControl<SelectModel>" %>
<div class="set">
<%= Html.LabelFor(model => model) %>
<select id="<%= ViewData.ModelMetadata.PropertyName %>_Value" name="<%=ViewData.ModelMetadata.PropertyName %>.Value">
<% foreach (var item in Model.Items) { %>
<%= Html.OptionFor(item) %>
<% } %>
</select>
</div>
. OptionFor - ,
, , ModelBinder . "Priority.Value". , Value , SelectModel, . , , .
, " " , " ". , MultiSelect, .
, .
, ViewModel :
public interface IValidatable
{
bool HasValue { get; }
bool IsValid { get; }
}
ValidationAttribute:
public class IsValidAttribute : ValidationAttribute
{
public IsValidAttribute()
{
ErrorMessage = "(not valid)";
}
public bool IsRequired { get; set; }
private bool Is(object value)
{
return value != null && !"".Equals(value);
}
public override bool IsValid(object value)
{
if (!Is(value) && !IsRequired)
return true;
if (!(value is IValidatable))
throw new InvalidOperationException("IsValidAttribute requires underlying property to implement IValidatable");
IValidatable validatable = value as IValidatable;
return validatable.IsValid;
}
}
, ViewModel, :
[IsValid(ErrorMessage = "Please enter a valid start date/time")]
public DateAndTimeModel Start { get; set; }