如何借助 ViewBag 自动获取对象的值
How to take a value of object automatically with help of ViewBag
我有一个问题如何从其他模型中获取变量的值。我会尽力解释。
有一个办公室列表。 “Office”模型包含一些办公室和那里的 PC 名称。此外,这里还有一个请求列表(例如,寻求帮助支持)。任何请求都包含日期、办公室编号、PC 名称和评论。我做了一个用户可以选择办公室数量的系统。但是后来我遇到了问题。
申请表中要求PC名称取自Office列表,具体取决于Office编号。怎么做?
型号:Office.cs 和 Request.cs
public class Office
{
public int Id { get; set; }
public string Number { get; set; } = "";
public string PC { get; set; } = "";
}
public class Request
{
public int Id { get; set; }
public DateTime DateRequest { get; set; }
public string Office { get; set; } = "";
public string PC { get; set; } = "";
public string Comment { get; set; } = "";
}
表单控制器:
private IRepository _repo;
public RequestsController(IRepository repo)
{ _repo = repo;}
[HttpGet]
public IActionResult EditRequest(int? id)
{
var offices = _repo.GetAllOffices();
ViewBag.Offices = new SelectList(offices, "Number", "Number");
if (id == null)
return View(new Request());
else
{
var request = _repo.GetRequest((int)id);
return View(request);
}
}
[HttpPost]
public async Task<IActionResult> EditRequest(Request request)
{
if (request.Id > 0)
_repo.UpdateRequest(request);
else
{
request.Created = DateTime.Now;
_repo.AddRequest(request);
}
if (await _repo.SaveChangesAsync())
return RedirectToAction("Home");
else
return View(request);
}
}
}
查看:
<form asp-controller="Requests" asp-action="EditRequest" method="post">
<input asp-for="id" type="hidden" />
<div>
<label>Date</label>
<input asp-for="DateRequest" />
</div>
<div>
<label asp-for="Office">Your office </label>
<select asp-for="Office" asp-items="ViewBag.Offices"></select>
</div>
<input asp-for="PC" value="????" type="hidden" /> /* There is a problem! */
<div>
<label>Your Comment</label>
<input asp-for="Comment" />
</div>
<input type="submit" value="Send" />
</form>
例如办公室列表(编号-电脑名):
1 - 联想,2 - 惠普,3 - 惠普,4 - 三星,5 - 联想。
如果用户在数字中选择“3”,表格将在“PC”中添加“HP”。
对于public SelectList(IEnumerable items, string dataValueField, string dataTextField);
,第一个参数是来源,第二个参数是select中的每个选项值,第三个参数是html中的每个选项文本。
所以您需要像下面这样更改您的 ViewBag 设计,它将生成带有 Number
的选项文本和带有 PC
:
的选项值
ViewBag.Offices = new SelectList(offices, "PC", "Number");
然后添加.change()
事件来设置<input asp-for="PC"/>
的值:
@section Scripts
{
<script>
$('#Office').change(function() {
$("#PC").val($(this).val());
});
</script>
}
我有一个问题如何从其他模型中获取变量的值。我会尽力解释。
有一个办公室列表。 “Office”模型包含一些办公室和那里的 PC 名称。此外,这里还有一个请求列表(例如,寻求帮助支持)。任何请求都包含日期、办公室编号、PC 名称和评论。我做了一个用户可以选择办公室数量的系统。但是后来我遇到了问题。
申请表中要求PC名称取自Office列表,具体取决于Office编号。怎么做?
型号:Office.cs 和 Request.cs
public class Office
{
public int Id { get; set; }
public string Number { get; set; } = "";
public string PC { get; set; } = "";
}
public class Request
{
public int Id { get; set; }
public DateTime DateRequest { get; set; }
public string Office { get; set; } = "";
public string PC { get; set; } = "";
public string Comment { get; set; } = "";
}
表单控制器:
private IRepository _repo;
public RequestsController(IRepository repo)
{ _repo = repo;}
[HttpGet]
public IActionResult EditRequest(int? id)
{
var offices = _repo.GetAllOffices();
ViewBag.Offices = new SelectList(offices, "Number", "Number");
if (id == null)
return View(new Request());
else
{
var request = _repo.GetRequest((int)id);
return View(request);
}
}
[HttpPost]
public async Task<IActionResult> EditRequest(Request request)
{
if (request.Id > 0)
_repo.UpdateRequest(request);
else
{
request.Created = DateTime.Now;
_repo.AddRequest(request);
}
if (await _repo.SaveChangesAsync())
return RedirectToAction("Home");
else
return View(request);
}
}
}
查看:
<form asp-controller="Requests" asp-action="EditRequest" method="post">
<input asp-for="id" type="hidden" />
<div>
<label>Date</label>
<input asp-for="DateRequest" />
</div>
<div>
<label asp-for="Office">Your office </label>
<select asp-for="Office" asp-items="ViewBag.Offices"></select>
</div>
<input asp-for="PC" value="????" type="hidden" /> /* There is a problem! */
<div>
<label>Your Comment</label>
<input asp-for="Comment" />
</div>
<input type="submit" value="Send" />
</form>
例如办公室列表(编号-电脑名): 1 - 联想,2 - 惠普,3 - 惠普,4 - 三星,5 - 联想。 如果用户在数字中选择“3”,表格将在“PC”中添加“HP”。
对于public SelectList(IEnumerable items, string dataValueField, string dataTextField);
,第一个参数是来源,第二个参数是select中的每个选项值,第三个参数是html中的每个选项文本。
所以您需要像下面这样更改您的 ViewBag 设计,它将生成带有 Number
的选项文本和带有 PC
:
ViewBag.Offices = new SelectList(offices, "PC", "Number");
然后添加.change()
事件来设置<input asp-for="PC"/>
的值:
@section Scripts
{
<script>
$('#Office').change(function() {
$("#PC").val($(this).val());
});
</script>
}