4

所以我试图将 .cshtml 视图中的这种剃刀语法转换为 .cs 中的辅助扩展。Darin 在这里发表了一篇很棒的文章: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

4

2 回答 2

6
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>
于 2012-04-13T21:58:08.133 回答
0

调用BeginForm会呈现表单标记,因此您无需执行任何操作,只需调用该方法即可。

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

using 语句将导致.Dispose()在方法返回之前被调用,导致字符串写入关闭表单标记之后。html.ViewContext.Writer.Write使用代替将字符串写入响应。(见达林迪米特洛夫的回答

将调用包装在 using 将自动导致结束表单标记在Dispose被调用时也被呈现。

于 2012-04-13T21:53:34.757 回答