Asp Net Html Помощник редактора для значения по умолчанию? - PullRequest
0 голосов
/ 03 апреля 2020

Привет, ребята, у меня есть форма, которая в качестве 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);            
    }
...