c# - 如何从控制器中的 SelectList 设置属性值
问题描述
我正在尝试设置位于我的项目模型中的属性的值。我想要的是在下拉列表中选择一个值,当我点击创建时,它将所选值设置为属性的值,这显然会发生在相应控制器的“创建”操作中。问题是我无法将“.SelectedValue”与选择列表一起使用并将其设置为模型的属性。
有两种“创建”操作方法,一种是参数化的,另一种是非参数化的。前者将数据保存到表中,后者获取值。我以未参数化的方法创建了一个整数列表,并尝试将其放入 ViewBag 中(效果很好)。当我运行代码时,视图工作并且下拉列表由列表项填充。但是在我输入了必要的详细信息后,我按了 Enter,尽管我已将模型的属性设置为下拉列表的 SelectedValue,但它仍为 NULL。
模型:
namespace Test.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public partial class LabAsign
{
[Display(Name = "ID")]
public int LbAs_id { get; set; }
[Display(Name = "Organization ID")]
public Nullable<int> LbAs_orgId { get; set; }
[Display(Name = "Labor ID")]
public Nullable<int> LbAs_LabId { get; set; }
}
控制器
public static int LabId
public ActionResult Create()
{
ViewBag.LbAs_CmplntId = new SelectList(db.Complaints, "Cmplnt_Id");
var list = new List<int>();
foreach (var item in db.Labors)
{
string c = item.Lab_OrgId.ToString();
if (c == HomeController.c_orgid.ToString())
{
list.Add(item.Lab_id);
}
}
var selectList = new SelectList(list);
Session["labid"] = list;
ViewBag.LbAsLabId = selectList;
//ViewBag.LbAs_LabId = new SelectList(db.Labors, "Lab_id",
"Lab_name");
ViewBag.LbAs_orgId = new SelectList(db.Organizations, "org_id",
"org_name");
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include =
"LbAs_id,LbAs_orgId,LbAs_LabId,LbAs_date,LbAs_CmplntId,LbAs_complStatus")]
LabAsign labAsign)
{
if (ModelState.IsValid)
{
var selectList = new
SelectList((System.Collections.IEnumerable)Session["labid"]);
LabId = (int)selectList.SelectedValue;
labAsign.LbAs_LabId = LabId;
db.LabAsigns.Add(labAsign);
db.SaveChanges();
return RedirectToAction("IndexLbAsOrg");
}
ViewBag.LbAs_CmplntId = new SelectList(db.Complaints,
"Cmplnt_Id","complnt_content", labAsign.LbAs_CmplntId);
ViewBag.LbAs_LabId = new SelectList(db.Labors, "Lab_id",
"Lab_name", labAsign.LbAs_LabId);
ViewBag.LbAs_orgId = new SelectList(db.Organizations, "org_id",
"org_name", labAsign.LbAs_orgId);
return View(labAsign);
}
看法 :
@model Test.Models.LabAsign
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>LabAsign</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger"
})
<div class="form-group">
@Html.LabelFor(model => model.LbAs_orgId, "Organization
ID", htmlAttributes: new { @class = "control-label col-md-2"@*, @style =
"display:none;"*@ })
<div class="col-md-10">
@Html.EditorFor(model => model.LbAs_orgId, new {
htmlAttributes = new { @class = "form-control"@*, @style =
"display:none;"*@,
@Value = Session["UserId"]} })
@Html.ValidationMessageFor(model => model.LbAs_orgId,
"", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.LbAs_LabId, "LbAs_LabId",
htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("LbAsLabId", null, htmlAttributes:
new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.LbAs_LabId,
"", new { @class = "text-danger" })
</div>
</div>
如您所见,我正在使用 Sessions 将列表从一个创建方法传输到另一个,声明一个新的选择列表并使用选择列表中的 SelectedValue 来更新属性,但这会引发此异常:
System.NullReferenceException: Object reference not set to an instance
of an object.
当我尝试通过将视图的值设置为直接设置下拉列表的值时:
@Html.DropDownList("LbAsLabId", null, htmlAttributes: new { @class =
"form-control", @Value = Session["labid"] })
属性值设置为 NULL 但不抛出异常
解决方案
推荐阅读
- fortran - 有没有可能在 Fortran 控制台中隐藏光标间运行时间?
- json - 如何导入在外部 json 文件中定义的地图?
- python - Python - 缺少 rest_framework 模块
- python - 如何使数据框全局化并在函数中使用它?
- flutter - 如何将子项动态添加到 Scaffold 小部件
- javascript - 在 NestJS 中测试解析器
- linux - Reverse sort 3rd numeric column in file
- elixir - Update Ecto Changeset Assocations
- java - 使用 JDBC 模板处理 100K 插入和更新
- python-3.x - 使用 Python-pptx,PowerPoint 有什么条件会导致 KeyError?