TheRedEye
Большое спасибо, Брайан. Вы поставили меня на правильный путь с классом DummyControl. Мой реальный пользовательский элемент управления должен был иметь около 12 входов, поэтому иметь имя элемента управления для каждого было немного грязно. В конечном счете я искал свойство HtmlFieldPrefix для решения проблемы уникальных входных идентификаторов. Вот простой пример решения, которое я получил:
// data model
public class Person
{
public string Name { get; set; }
public DateTimeControl DateOfBirth { get; set; }
public DateTimeControl DateOfDeath { get; set; }
}
// model to hold UserControl values
public class DateTimeControl
{
[Display(Name = "Day: ")]
public string Day { get; set; }
[Display(Name = "Month: ")]
public string Month { get; set; }
[Display(Name = "Year: ")]
public string Year { get; set; }
}
А частичный вид выглядит следующим образом:
@model Models.DateTimeControl
<div class="form-group">
@Html.LabelFor(m => m.Day)
@Html.EditorFor(m => m.Day, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.Month)
@Html.EditorFor(m => m.Month, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.Year)
@Html.EditorFor(m => m.Year, new { @class = "form-control" })
</div>
Затем я могу использовать частичное представление несколько раз в одном и том же представлении, преодолевая уникальные идентификаторы с помощью свойства HtmlFieldPrefix.
<div class="form-group">
@Html.LabelFor(m => m.Name)
@Html.EditorFor(m => m.Name, new { @class = "form-control" })
</div>
@Html.Partial("_DateTimeInput", Model.DateOfBirth, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "DateOfBirth" } })
@Html.Partial("_DateTimeInput", Model.DateOfDeath, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "DateOfDeath" } })
Так что сгенерированный HTML-код:
<div class="form-group">
<label for="DateOfBirth_Day">Day: </label>
<input class="text-box single-line" id="DateOfBirth_Day" name="DateOfBirth.Day" type="text" value="" />
</div>
<div class="form-group">
<label for="DateOfBirth_Month">Month: </label>
<input class="text-box single-line" id="DateOfBirth_Month" name="DateOfBirth.Month" type="text" value="" />
</div>
<div class="form-group">
<label for="DateOfBirth_Year">Year: </label>
<input class="text-box single-line" id="DateOfBirth_Year" name="DateOfBirth.Year" type="text" value="" />
</div>
<div class="form-group">
<label for="DateOfDeath_Day">Day: </label>
<input class="text-box single-line" id="DateOfDeath_Day" name="DateOfDeath.Day" type="text" value="" />
</div>
<div class="form-group">
<label for="DateOfDeath_Month">Month: </label>
<input class="text-box single-line" id="DateOfDeath_Month" name="DateOfDeath.Month" type="text" value="" />
</div>
<div class="form-group">
<label for="DateOfDeath_Year">Year: </label>
<input class="text-box single-line" id="DateOfDeath_Year" name="DateOfDeath.Year" type="text" value="" />
</div>
При смешивании с дополнительными входными данными во внешнем виде вся модель заполняется и отправляется контроллеру, как и ожидалось, когда пользователь нажимает кнопку отправки.