【发布时间】:2019-09-12 00:33:22
【问题描述】:
我将一个下拉列表作为我的视图模型的一部分传递给创建视图。
视图模型:
public class VendorVM
{
public Entities.Vendor Vendor { get; set; }
public SelectList VendorParentList { get; set; }
public string VendorParentSelected { get; set; }
}
查看:
@Html.DropDownListFor(x => Model.VendorParentSelected, new SelectList(Model.VendorParentList, "Value", "Text"), "-- Select --", htmlAttributes: new { @class = "form-control", id = "ddVendorParent" })
控制器:
[HttpGet]
public ActionResult Create()
{
VendorVM theVendorVM = new VendorVM();
theVendorVM.Vendor = new Entities.Vendor();
List<Entities.Vendor> theVendorList = BLL.GetData.RetrieveVendorParents();
theVendorVM.VendorParentList = new SelectList(theVendorList, "ID", "Name");
return View(theVendorVM);
}
[HttpPost]
public ActionResult Create(VendorVM theVendorVM)
{
try
{
Entities.Vendor theVendor = new Entities.Vendor();
Entities.Vendor theVendorParent = new Entities.Vendor();
if (theVendorVM.VendorParentSelected != null)
{ theVendorParent.ID = Convert.ToInt32(theVendorVM.VendorParentSelected); }
theVendorVM.Vendor.VendorParent = theVendorParent;
// Store the Vendor
theVendor = BLL.StoreData.InsertVendor(theVendorVM.Vendor);
theVendor.Errors.Add("Holy Cannoli!!!");
if (theVendor.HasErrors)
{
foreach (String err in theVendor.Errors)
{
ModelState.AddModelError(string.Empty, err);
}
return View(theVendorVM);
}
else { return RedirectToAction("Index"); }
}
catch (Exception ex)
{
return View();
}
}
当我从视图中返回 POST 时,VendorParentList == NULL。
我在这里用“Holy Cannoli”伪造服务器端错误。我希望能够保持 ViewModel 状态并重新显示出现错误的视图。
为什么 ViewModel.VendorParentList 为空? Vendor 对象包含正确的值。我发送给 View 的 Viewmodel 中的任何 List 都会以 null 的形式返回到 POST。
我该如何解决这个问题。或者,更好的是,我做错了什么?
【问题讨论】:
-
这就是在表单中发布的方式。仅发布表单控件(输入、ddls、隐藏字段、文本区域等)。不是整个视图模型。为什么不在帖子中再次从数据库中获取您的视图模型或列表?
-
这就是我现在正在做的事情。不得不再次从数据库请求或构建会话变量以进行缓存似乎非常浪费。你提到了 dd,但是它们没有被退回——这就是问题所在。我必须捕获所做的选择,但没有发布整个 dd。
-
ddls 是指下拉列表中的选定值。不是整个下拉列表。来自网络表单,您可能会觉得这很奇怪,但仅发布所需的信息可以最大限度地减少传输到服务器的数据。如果您确实需要发布选择列表,请使用 for 循环和表单内的 vendorlist 项的隐藏字段。
标签: asp.net-mvc razor model-view-controller