【问题标题】:Embed Input field to Hyperlink in MVC将输入字段嵌入到 MVC 中的超链接
【发布时间】:2013-11-05 13:53:40
【问题描述】:

是否可以将隐藏字段值从 Razor 视图传递到控制器内部或标记?由于该字段是隐藏,因此将其值传递给 Controller 确实是一个问题。另一方面,我认为传递此隐藏字段的唯一方法是在超链接中使用输入字段。如何创建如下代码?

<a href="/Admin/Delete?ApplicantID=44">
<img class="myclass" src="../../Content/delete.png" title="Delete" />
<input type="hidden" value= "Delete" /></a>


更新

查看:

...
grid.Column("Actions", format: (item) =>
 new HtmlString(
      @Html.ActionImage("../../Content/detail.png", "Detail", "icon-link", "Detail", "Admin", new { applicantId = item.ApplicantID }).ToString() +
      @Html.ActionImage("../../Content/edit.png", "Edit", "icon-link", "Edit", "Admin", new { applicantId = item.ApplicantID }).ToString() +
      @Html.ActionImage("../../Content/delete.png", "Delete", "icon-link", "Delete", "Admin", new { applicantId = item.ApplicantID }).ToString()
 )
)
...


控制器:

[HttpPost]
public ActionResult Delete(int applicantId)
{
    Applicant deletedApplicant = repository.DeleteApplicant(applicantId);
    if (deletedApplicant != null)
    {
        TempData["message"] = string.Format("{0} was deleted",
        deletedApplicant.Name);
    }
        return RedirectToAction("Index");
    }
}


辅助方法:

public static MvcHtmlString ActionImage(this HtmlHelper html, string imagePath, string alt, string cssClass,
       string action, string controllerName, object routeValues)
{
    var currentUrl = new UrlHelper(html.ViewContext.RequestContext);
    var imgTagBuilder = new TagBuilder("img");
    imgTagBuilder.MergeAttribute("src", currentUrl.Content(imagePath));
    imgTagBuilder.MergeAttribute("title", alt);
    imgTagBuilder.MergeAttribute("class", cssClass);
    string imgHtml = imgTagBuilder.ToString(TagRenderMode.SelfClosing);
    var anchorTagBuilder = new TagBuilder("a"); 
    anchorTagBuilder.MergeAttribute("href", currentUrl.Action(action, controllerName, routeValues));
    anchorTagBuilder.InnerHtml = imgHtml; 
    string anchorHtml = anchorTagBuilder.ToString(TagRenderMode.Normal);
    return MvcHtmlString.Create(anchorHtml);
}

【问题讨论】:

  • 所以您想从 GET 而不是 POST 执行实际删除?

标签: asp.net-mvc razor parameter-passing hidden-field input-field


【解决方案1】:

&lt;input&gt;&lt;textarea&gt;&lt;button&gt;&lt;select&gt; 元素值仅在表单提交期间传递。此外,它们仅在分配了name 属性时才被传递。

单击锚点不会传递这些值(除非您插入一些 JavaScript 并将其附加到 URL)。最简单的方法是将您的链接转换为迷你形式:

@using (Html.BeginForm("Delete", "Admin", FormMethod.POST,
                       new { ApplicantID = @Model.ApplicantID }))
{
    <!-- make sure to give this field a name -->
    <input type="hidden" name="???" value="Delete" />
    <input type="image" src="@Url.Content("~/Content/delete.png")" title="Delete" />
}

否则,请使用 javascript 并绑定到锚点的单击事件并在继续之前注入隐藏输入的值。

【讨论】:

  • 感谢您的回复。实际上,我已经在 View 和 Controller 上使用了相同的 id 值,如上所示。由于隐藏字段,该问题实际上与删除操作有关。因为我可以通过按视图上的编辑图标(在 GridView 列中)轻松打开编辑表单,但我无法调用 Delete Post 方法。另一方面,我已经尝试了很多时间在不同的地方使用“@using (Html.BeginForm("Delete", "Admin"))" 和 "@Html.Hidden("ApplicantID", item.ApplicantID)" 属性表格。但这没有任何意义。>>>
  • >>> 所以,如果你能澄清我如何更改我的辅助方法和操​​作行“@Html.ActionImage(”../../Content/detail),我会很高兴.png”、“Detail”、“icon-link”、“Detail”、“Admin”、new {除此之外,我认为我应该在正确的位置使用“@using (Html.BeginForm()”。您能否也举一个我的代码示例?非常感谢您的所有考虑。
【解决方案2】:

根据下面的讨论,试试这个。

@Ajax.ActionLink("Delete",
                    "Delete", new { applicantid = item.applicantid },
                    new AjaxOptions
                    {
                        Confirm = "Delete?",
                        HttpMethod = "POST",
                    }, new { @class = "classname" })

a.classname
{
    background: url(~/Content/delete.png) no-repeat top left;
     display: block;
     width: 150px;
     height: 150px;
     text-indent: -9999px; /* hides the link text */
}

注意:这不需要在表单中。

【讨论】:

  • 是的;只是补充一下,因为我不确定OP是否理解这一点;当涉及到发送到服务器的内容时​​,“隐藏”字段与任何其他表单字段没有什么不同。上面的一个小改动:从技术上讲,您应该使用name 属性,而不是id 属性作为浏览器在表单提交时发送的值的名称。如果您不包含name,浏览器将使用 id,但最好从一开始就使用名称。另外,输入标签可以有多个同名,但每个id只有一个。
  • @Ethan Pelton:感谢您的回复。实际上,我已经在 View 和 Controller 上使用了相同的 id 值,如上所示。由于隐藏字段,该问题实际上与删除操作有关。因为我可以通过按视图上的编辑图标(在 GridView 列中)轻松打开编辑表单,但我无法调用 Delete Post 方法。另一方面,我已经尝试了很多时间在不同的地方使用“@using (Html.BeginForm("Delete", "Admin"))" 和 "@Html.Hidden("ApplicantID", item.ApplicantID)" 属性表格。但这没有任何意义。 >>>
  • >>> 所以,如果你能澄清我如何更改我的辅助方法和操​​作行“@Html.ActionImage(”../../Content/detail),我会很高兴.png", "Detail", "icon-link", "Detail", "Admin", new {申请人Id = item.ApplicantID }).ToString()" 在视图上。除此之外,我认为我应该在正确的位置使用“@using (Html.BeginForm()”。您能否也举一个我的代码示例?非常感谢您的所有考虑。
  • 恐怕我不明白你想要完成什么。也许你可以从头开始?看起来您希望用户单击链接并显示他们单击的项目的详细信息。对吗?
  • 我只是想通过单击相关记录附近的图像链接来删除记录。为了做到这一点,我使用了一个自定义 HTML Helper,它让我可以使用图像作为链接。但是,虽然我可以使用编辑链接并通过单击 WebGrid 上记录附近的编辑链接打开编辑页面,但我无法删除任何记录。我唯一需要使用删除图像按钮并通过按下它来删除记录。我认为真正的问题在于在 View 和 hidden 属性上定位“@using (Html.BeginForm()”。因为记录 id 无法传递给 Controller。我该如何提供这个?谢谢
猜你喜欢
  • 1970-01-01
  • 2015-03-04
  • 2011-03-04
  • 1970-01-01
  • 2020-05-13
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多