Привет, ребята, у меня есть форма, которая в качестве EnumDropDownListFor со значением «Другое», когда выбрано «Другое», отображается в форме EditorFor, которая требуется. Все работает, за исключением случаев, когда я отправляю форму без изменения значения EnumDropDownListFor, что приводит к тому, что значение EditorFor будет установлено как нулевое.
Я опробовал множество подходов к этому, и тот, который я сейчас, наиболее близок к завершению функции на 100%.
Вот моя модель:
public class ReportCatalogue
{
private MeasuresEnum measuresEnum;
private string measureOther;
public string Measures { get; set; }
[Required]
public MeasuresEnum MeasuresEnumValue
{
get
{
return measuresEnum;
}
set
{
measuresEnum = value;
Measures = value.ToString();
}
}
[Required]
public string MeasureOther
{
get
{
return measureOther;
}
set
{
if (Measures == MeasuresEnum.Other.ToString())
{
measureOther = value;
if (!string.IsNullOrEmpty(value))
{
Measures += ": " + value;
}
}
else
{
measureOther = "Not in use";
}
}
}
public enum MeasuresEnum
{
[Display(Name = "[Value] per HL")]
perHL,
[Display(Name = "[Value] per NR")]
perNR,
[Display(Name = "[Value] per Marketing Investment")]
perMarketingInvestment,
[Display(Name = "[Value] % of Gross Sales")]
PercentOfGrossSales,
[Display(Name = "[Value] % of NR")]
percentOfNR,
Other
}
}
Вот часть моей страницы с EnumDropDownListFor ...:
<div class="form-group">
@Html.LabelFor(model => model.ReportCatalogue.Measures,
htmlAttributes: new { @class = "control-label col-md-6" })
<div class="col-md-10">
@Html.EnumDropDownListFor(model => model.ReportCatalogue.MeasuresEnumValue,
new
{
@onchange = "dynamicInputDB(this)",
htmlAttributes = new
{
@class = "form-control",
}
})
@Html.EditorFor(model => model.ReportCatalogue.MeasureOther,
new
{
htmlAttributes = new
{
@id = "ReportCatalogue.MeasuresEnumValue",
@class = "form-control",
@placeholder = @ReportCatalogue.MeasuresEnum.Other,
@hidden = true
}
})
@Html.ValidationMessageFor(model => model.ReportCatalogue.MeasureOther,
"", new
{
@id = "ReportCatalogue.MeasuresEnumValueOther",
@class = "text-danger",
})
</div>
</div>
Вот часть Script:
function dynamicInputDB(dbox) {
var input = document.getElementById(dbox.name);
var error = document.getElementById(dbox.name + "Other");
console.log(dbox.value)
if (dbox.value == @((int)ReportCatalogue.MeasuresEnum.Other)) {
error.hidden = false;
input.value = null;
input.hidden = false;
}
else {
input.value = "Not in use";
error.hidden = true;
input.hidden = true;
}
};
А вот метод Controller, который имеет дело с формой:
public ActionResult AddItem(ReportCatalogue reportCatalogue)
{
bool success;
if (ModelState.IsValid)
{
try
{
reportCatalogue.Id = _reportCatalogueProvider.AddReportCatalogue(reportCatalogue);
success = true;
}
catch (Exception)
{
success = false;
}
return Json(new { Success = success, Result = reportCatalogue }, JsonRequestBehavior.AllowGet);
}
return View(reportCatalogue);
}