如何在自定义助手中使用Html.BeginForm?

时间:2012-04-13 21:46:56

标签: c# asp.net-mvc-3 razor html-helper

所以我试图将.cshtml视图中的这个剃刀语法转换为.cs中的帮助扩展。达林在这里有一篇很棒的文章:https://stackoverflow.com/a/8187441/1026459。但是,我遇到了一些问题。

这是普通标记

@using (Html.BeginForm("Restore", "GlobalCrud"))
{
 @Html.Hidden("entityId", "Id")
 <input class="ui-icon ui-icon-power" type="submit" 
  onclick="return confirm('Clicking OK will restore this record');" 
 />
}

这是扩展

public static MvcHtmlString EditOrDelete(this HtmlHelper html)
{
  var s = html.BeginForm();
  return MvcHtmlString.Create(s + " additional fields " + "</form>");
}

这是用法:

@using namespace.CustomHelper
@Html.EditOrDelete()

这是输出:

<form method="post" action="/Completed/Manage">
System.Web.Mvc.Html.MvcForm additional fields 
</form>

大部分助手的延伸产生了我的需要。但是,我不确定我应该如何将其转换回正确的html字符串。返回包括文本中的System.Web.Mvc.Html.MvcForm。我在这里添加" additional fields "是为了简洁,因为那里没有问题。添加</form>是因为我知道using的正常@Html.BeginForm()语句在处置时会添加</form>标记。

如何正确返回.BeginForm生成的表单?

2 个答案:

答案 0 :(得分:5)

public static class HtmlExtensions
{
    public static void EditOrDelete(this HtmlHelper html)
    {
        using (html.BeginForm())
        {
            html.ViewContext.Writer.Write("additional fields");
        }
    }
}

然后:

@using namespace.CustomHelper
@{Html.EditOrDelete();}

发射:

<form action="/" method="post">additional fields</form>

答案 1 :(得分:0)

调用BeginForm呈现表单标记,因此除了调用该方法之外,您无需执行任何操作。

<击>

<击>
public static MvcHtmlString EditOrDelete(this HtmlHelper html)
{
    using(html.BeginForm())
    {
        return MvcHtmlString.Create(" additional fields ");
    }
}

<击>

using语句将导致在方法撤销之前调用.Dispose(),导致在结束表单标记之后写入字符串。使用html.ViewContext.Writer.Write将字符串写入响应。 (见Darin Dimitrov's answer

在调用Dispose时,

将调用包装在使用中会自动生成结束表单标记。