Вы не можете иметь два элемента <input>
с одинаковыми именами.Если опубликовано <form>
, содержащее несколько входов с одним и тем же именем, связыватель модели MVC будет привязывать только одно значение из последнего ввода.
Чтобы достичь желаемого, у вас есть два варианта:
Либо есть только один вход с name="Data"
из type="text"
в представлении, и пусть указатель времени записывает время в виде строки для этого ввода.Затем в контроллере проанализируйте это входное значение в зависимости от выбранного Type
.
Или используйте два входа с name="TextData"
и name="TimeData"
, отключите и скройте один из этих входов.используя JS в зависимости от выбранного Type
.В контроллере считайте значение с правого входа в зависимости от выбранного Type
.Возможно, это более чистое решение.
В MVC5 второе решение будет выглядеть так (я не знаком с MVC-Core):
@model MyViewModel
@using (Html.BeginForm("Submit", "MyController", FormMethod.Post)) {
@Html.EditorFor(m => m.Type)
@Html.EditorFor(m => m.TextData, new { @class = "text-input"})
@Html.EditorFor(m => m.TimeData, new { @class = "timepicker"})
}
<script type="text/javascript">
function toggleInput_() {
if ($('#@Html.IdFor(m => m.Type)').val() === 'Text') {
$('#@Html.IdFor(m => m.TextData)').prop('disabled', false).show();
$('#@Html.IdFor(m => m.TimeData)').prop('disabled', true).hide();
}
else {
$('#@Html.IdFor(m => m.TextData)').prop('disabled', true).hide();
$('#@Html.IdFor(m => m.TimeData)').prop('disabled', false).show();
}
}
$(document).ready(function() {
$('#@Html.IdFor(m => m.Type)').on('change', function() {
toggleInput_(); // toggle when drop down changes
});
toggleInput_(); // toggle initially on page load
});
</script>
Контроллер:
[HttPost]
public ActionResult Submit(MyViewModel postData) {
string textValue = null;
DateTime? timeValue = null;
if (postData.Type == "Text") {
textValue = postData.TextData;
}
else {
timeValue = postData.TimeData;
}
// ...
}