在控制器之间传递参数

本文关键字:参数 之间 控制器 | 更新日期: 2023-09-27 18:23:56

我的目标是将与当前详细信息视图中的项目相关联的记录保存在不同的控制器中。我有一个详细视图,它使用以下代码显示来自不同表的相关记录列表:

<table class="table">
    <tr>
        <th>
            Date
        </th>
        <th>
            Notes
        </th>
        <th>
            Contractor
        </th>
    </tr>
    @foreach (var item in Model.ServiceHistories)
    {
        <tr>
            <td width="200px">
                @Html.DisplayFor(modelItem => item.Date)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Notes)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ContractorID)
            </td>
        </tr>
    }
    @Html.ActionLink("Create", "Create", "ServiceHistories", new { id = Model.AssetID }, null)
</table>

在底部,我添加了一个操作链接到另一个控制器中的操作,通过传入该资产的AssetID来为该资产创建一个新的服务历史记录。这是Service History:的创建(POST和GET)操作

// GET: ServiceHistories/Create
public ActionResult Create(int? id)
{
    ViewBag.AssetID = id;
    return View();
}
// POST: ServiceHistories/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ServiceID,AssetID,Date,ContractorID,Notes")] ServiceHistory serviceHistory)
{
    if (ModelState.IsValid)
    {
        db.ServiceHistories.Add(serviceHistory);
        db.SaveChanges();
        return RedirectToAction("Details", "Assets", new { id = serviceHistory.AssetID });
    }
    ViewBag.AssetID = new SelectList(db.Assets, "AssetID", "Description", serviceHistory.AssetID);
    return View();
}

我已经将(int Id)作为参数添加到Create操作中,并将其分配给ViewBg.AssetID,此时它将被传递到视图中,因为我可以在页面上显示它。我的问题是

我的第一个问题是如何使用这个值来替换下面的代码。也就是说,我想隐藏AssetID字段,而使用参数ViewBag.AssetID。

<div class="form-group">
    @Html.LabelFor(model => model.AssetID, "AssetID", htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownList("AssetID", null, htmlAttributes: new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.AssetID, "", new { @class = "text-danger" })
    </div>
</div>

我试过

@Html.HiddenFor(ViewBag.AssetID)

然而,我无法使它编译错误:

编译器错误消息:CS1973:"System.Web.Mvc.HtmlHelper"没有名为"HiddeFor"的适用方法,但似乎具有该名称的扩展方法。无法动态调度扩展方法。请考虑强制转换动态参数或在不使用扩展方法语法的情况下调用扩展方法。

我读了很多接近这一点的帖子和教程,但我似乎可以破解我做错了什么。

如有任何帮助,我们将不胜感激。

在控制器之间传递参数

不确定为什么要将其分配给ViewBag,因为模型ServiceHistory具有属性AssetID

控制器

public ActionResult Create(int? id)
{
  ServiceHistory model = new ServiceHistory();
  model.AssetID = id;
  return View(model);
}

查看

@model YourAssembly.ServiceHistory
....
@Html.HiddenFor(m => m.AssetID)