Ошибка при связывании dropdownlistFor. Выдает исключение Null при отправке значения. - PullRequest
0 голосов
/ 24 апреля 2019

Я загружаю строго типизированный выпадающий список в MVC.Этот список заполняется с использованием значений БД. Я получаю значение с помощью linq и сопоставляю их с моделью.Эта модель определена внутри основной модели представления, которую я использую для своего представления. Поскольку существует несколько моделей для одного представления, над которым я работаю.Когда страница загружается, DDL загружает свои значения правильно, но проблема наступает, пока я пытаюсь передать значение методу HTTPPost в контроллере.в результате эта ошибка «Ссылка на объект не установлена ​​для экземпляра объекта.»

Я понимаю, что я пытаюсь получить доступ к свойству, которое является нулевым .. Но я не понимаю, как я могу связать DDL ссвойство, чтобы я не получил эту ошибку.Я довольно новичок в этом процессе привязки DropDownListFor.Я пробовал и другие форумы ... Но вместо того, чтобы копировать код, я подумал, что будет лучше, если я пойму, где я вначале ошибаюсь.

ViewModel для хранения данных

namespace ProjectDAL.Models.ViewModels
{
    public class SysTemViewModel
    {
        public int EmpID { get; set; }
        public int SysID { get; set; }
        public string SysName { get; set; }
    }
}

MainПросмотр модели

namespace ProjectDAL.Models.ViewModels
{
    public class MainViewModel
    {
        public IEnumerable<SysTemViewModel> SysNameForDDL { get; set; }
        public string SysName { get; set; }
    }
}

Действие Для загрузки DDL

public ActionResult Edit(int? id)
{
       if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }           

        MainViewModel mainVM = new MainViewModel();

        IEnumerable<SysTemViewModel> sysVM = null;
        sysVM = from s in dbEntities.EmpSystems
                .Where(x => x.Used == false)
                select new SysTemViewModel() { SysID = s.SysID, SysName = s.SysName };

        mainVM.SysNameForDDL = sysVM.ToList();
        return View(mainVM);
        }
}

DDL -> Действие для отправки данных в БД

[HttpPost]
public ActionResult CreateSysEntry([Bind(Include = "EmpID,SysID,SysName")] EmpAssignedSystems EAS, MainViewModel MVM)
{
       try
    {
            EAS.EmpID = MVM.Employees.FirstOrDefault().EmpID;
            EAS.ID = MVM.SysName;
            EAS.System = MVM.SysID;
            dbEntities.EmpAssignedSystems.Add(EAS);
            dbEntities.SaveChanges();
        }

      return View(/////I am not sure which model to pass here);
    }
     catch
       {
          return View();
       }
}

Вид

@model ProjectDAL.Models.ViewModels.MainViewModel

<div>

 @using (Html.BeginForm())
 {

<div class="row">
    <div class="col-md-6">
        <form id="system-form" method="post" enctype="multipart/form-data">
            <div class="form-body">
                <div class="form-group">
                    <label>System Name</label>
                    <div class="input-group" style="width:50%">
                       @Html.DropDownListFor(model => model.SysNameForDDL.FirstOrDefault().SysID, new SelectList(Model.SysNameForDDL, "SysID", "SysName"), new { @class = "form-control", @id="sysDDL" })
                    </div>
                </div>
                <div class="form-group">
                    <label>System ID</label>
                    @Html.EditorFor(model => model.SysName, new { htmlAttributes = new { @class = "form-control", @id="SysIDAdded" } })
                </div>
            </div>
            <div class="form-actions center">
                <button type="submit">
                    Save
                </button>
            </div>
        </form>
    </div>
</div>
}

</div>

<script>
    $(document).ready(function () {
        $('#system-form').on('submit', function (e) {
            e.preventDefault();
            //var getDDLVal = $("#sysDDL").val();

            var e = document.getElementById("sysDDL");
            var getDDLVal = e.options[e.selectedIndex].value;
            var getSysIDVal = $("#SysIDAdded").val();
            var getCurrentId = @Model.Employees.FirstOrDefault().EmpID;

            $.ajax({
                type: "POST",
                url: "/ProjectUser/CreateSysEntry",
                data: {
                    systemName: getDDLVal,
                    systemID: getSysIDVal,
                    EmpID: getCurrentId,
                    submit: "true"
                }
            });

        });
    })
</script>
...