Как передать выбранное значение DDL из Action в другое Action MVC / Ajax - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь передать выбранное значение раскрывающегося списка из одного действия (RMA), которое у меня есть в раскрывающемся списке, в другое действие (ProcessRequestRMA), в которое я хочу отправить значение раскрывающегося списка и сохранить его в базе данных с помощью Ajax.

из-за этого я делаю экземпляр этой модели представления (OrdreDetails_VM), которая содержит свойство раскрывающегося списка к другой модели просмотра (RMAHistory), которую я хочу получить выбранное значение и сохранить в базе данных, но когда я пытаюсь сохранить в базе данных, я получаю Object reference is not set to an instance of an object ( под var RMA = новая RMA_History). и из-за того, что свойство должно получить выбранное значение своим нулем. Уже несколько часов я борюсь с этим, но все равно не повезло :(

Может кто-нибудь, пожалуйста, помогите мне или направьте меня в правильном направлении:)
Заранее спасибо:)

OrdreDetails_VM & RMA Действие:

   public class OrdreDetails_VM
    {  
        public List<SelectListItem> RMAType { set; get; }
        public int SelectedRMAType { set; get; }
    }

    public ActionResult RMA(OrdreDetails_VM oodvm)
    { 
        //DDL
        oodvm.RMAType = new SelectList(data.RMAType, "ID", "RMASager").ToList();

        // do some another stuff
        return View(oodvm);

    }

RMAHistory_VM & ProcessRequestRMA:

   public class RMAHistory_VM
    {
      public OrdreDetails_VM VM { get; set; }

      public int RMAIDType { get; set; }
      public string RMASager { get; set; }
      public string Kundenavn { get; set; }
      public string Ordrenummer { get; set; }
    }

 public JsonResult ProcessRequestRMA(RMAHistory_VM model) 
 {
            var RMA = new RMA_History // its Modal
             {
                 Kundenavn = model.Kundenavn,
                 Ordrenummer = model.Ordrenummer,

                 //Expect to get selected value
                 RMATypeID = model.VM.SelectedRMAType

             };

            db.RMA_History.Add(RMA);
            db.SaveChanges();

           return Json(model, JsonRequestBehavior.AllowGet);

  }

 //Here is RMAHistory Modal:
  public class RMA_History
    {
      public int Id { get; set; }
      public string Kundenavn { get; set; }
      public string Ordrenummer { get; set; }
      public int? RMATypeID { get; set; }
    }
   public RMA_HistoryMap()
            {

           //RMA_History Mapping stuff

            }

Вид:

@model NameSpace.OrdreDetails_VM
        //DropDown
@Html.DropDownListFor(s => s.SelectedRMAType, Model.RMAType, "- Select -", new { @class = "form-control", @id = "SelectedRMAType" })

      <div class="row">
      <div class="col-md-12">
      <div class="form-group">
      <label>KundeNavn</label>
      <input name="Kundenavn" type="text" id="Kundenavn" class="form-control">

       </div>
      </div>

       <div class="col-md-12">
      <div class="form-group">
      <label>Ordrenummer</label>
     <input name="Ordrenummer" id="Ordrenummer" type="text" class="form-control" >

       </div>
       </div>
     </div>

AJAX:

<script>
        $(document).ready(function () {

            $("#btn").click(function (e) {
                e.preventDefault();

                return myfunction();
            });
    function myfunction() {

    var model = {

    Kundenavn: $("#Kundenavn").val(),
    Ordrenummer: $("#Ordrenummer").val(),
    SelectedRMAType: $("#SelectedRMAType").val()


    }

  $.ajax({
 type: 'POST',
 url: "/Account/ProcessRequestRMA",
 dataType: 'json',

 data: {

  Kundenavn: model.Kundenavn,
  Ordrenummer: model.Ordrenummer,

  RMATypeID: model.SelectedRMAType
  },
    success: function (status) {

    if (status) {

   status.Kundenavn = model.Kundenavn;
   status.Ordrenummer = model.Ordrenummer;

   status.RMATypeID = model.SelectedRMAType;
   console.log("Send");
}
    else {
    alert("Something Wrong");
  }

},

error: function () {
 console.log('something went wrong - debug it!');
}
 });
}
    });
    </script>

1 Ответ

0 голосов
/ 02 июля 2018

Основная проблема в том, что ваш View не привязан к правильной ViewModel. Вы говорите, что ваше представление работает с OrdreDetails_VM, когда оно фактически работает с RMAHistory_VM. Временные данные, точно так же, как те, которые представляет ваше свойство RMAType, должны либо входить в ту же модель ViewModel, если она у вас есть, либо как часть ViewBag, если вы не хотите ее создавать.

Итак, начнем с первого обновления RMAHistory_VM, чтобы получить необходимые данные:

public class RMAHistory_VM
{
    public int SelectedRMAType { get; set; }
    public string RMASager { get; set; }
    public string Kundenavn { get; set; }
    public string Ordrenummer { get; set; }

    public List<SelectListItem> RMATypes { set; get; }
}

Тогда давайте отбросим OrdreDetails_VM и заставим ваше представление правильно использовать RMAHistory_VM:

@model NameSpace.RMAHistory_VM

@Html.DropDownListFor(s => s.SelectedRMAType, Model.RMATypes, "- Select -", new { @class = "form-control", @id = "SelectedRMAType" })

<div class="row">
    <div class="col-md-12">
        <div class="form-group">
            <label>KundeNavn</label>
            <input name="Kundenavn" type="text" id="Kundenavn" class="form-control">
        </div>
    </div>

    <div class="col-md-12">
        <div class="form-group">
            <label>Ordrenummer</label>
            <input name="Ordrenummer" id="Ordrenummer" type="text" class="form-control" >

        </div>
    </div>
</div>

Обратите внимание, что ваш вызов AJAX также не соответствует структуре ViewModel (вы даже создаете объект, который вы не используете), поэтому вы должны соответствующим образом обновить его:

function myfunction() {
    var model = {
        Kundenavn: $("#Kundenavn").val(),
        Ordrenummer: $("#Ordrenummer").val(),
        SelectedRMAType: $("#SelectedRMAType").val()
    };

    $.ajax({
        type: 'POST',
        url: "/Account/ProcessRequestRMA",
        dataType: 'json',
        data: model,
        success: function (status) {
            if (status) {
                status.Kundenavn = model.Kundenavn;
                status.Ordrenummer = model.Ordrenummer;
                status.RMATypeID = model.SelectedRMAType;
                console.log("Send");
            }
            else {
                alert("Something Wrong");
            }
        },
        error: function () {
            console.log('something went wrong - debug it!');
        }
    });
};

И, наконец, обновите Действие, чтобы оно загружалось ViewBag.RMATypes:

public ActionResult RMA()
{ 
    //DDL
    var model = new RMAHistory_VM
    {
        RMATypes = new SelectList(data.RMAType, "ID", "RMASager").ToList();
    };

    // do some another stuff
    return View(model);
}

Затем вам нужно будет обновить способ обработки запроса, чтобы он соответствовал новой структуре ViewModel:

public JsonResult ProcessRequestRMA(RMAHistory_VM model) 
{
    var RMA = new RMA_History // its Modal
    {
        Kundenavn = model.Kundenavn,
        Ordrenummer = model.Ordrenummer,
        RMATypeID = model.SelectedRMAType
    };

    db.RMA_History.Add(RMA);
    db.SaveChanges();

    return Json(model, JsonRequestBehavior.AllowGet);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...