我正在尝试将下拉列表的选定值从我拥有下拉列表的一个动作(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>
答案 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);
}