如何借助 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>
}