跨控制器传递参数

时间:2014-09-23 03:33:14

标签: c# asp.net-mvc asp.net-mvc-5

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

<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>

在底部,我添加了一个Action链接,指向另一个控制器中的操作,通过传入该资产的AssetID为该资产创建新的服务历史记录。这是服务历史记录的创建(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'没有名为'HiddenFor'的适用方法,但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。

我已经阅读了大量的帖子和教程,但我似乎可以解决我的错误。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

由于您的模型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)