如何将DDL的选定值从Action传递到另一个Action MVC / Ajax

时间:2018-07-02 11:19:41

标签: c# jquery asp.net ajax asp.net-mvc

我正在尝试将下拉列表的选定值从我拥有下拉列表的一个动作(RMA)传递到另一个想要发送下拉列表的值的动作(ProcessRequestRMA),然后使用Ajax将其保存到数据库中。

因此,我创建了该视图模型(OrdreDetails_VM)的实例,该实例包含到另一个视图模型(RMAHistory)的下拉列表的属性,我想要获取所选值并将其保存到数据库中,但是当我尝试保存到数据库中时,我得到了Object reference is not set to an instance of an object(在var RMA = new RMA_History下)。并且因为该属性应该获得其null的选择值。一直为此苦苦挣扎,但仍然没有运气:(

任何人都可以帮助我或为我指出正确的方向:)
在此先感谢:)

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 :(得分:1)

这里的主要问题是您的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);
}