滚动我自己的@ Html.BeginfOrm()

时间:2011-06-17 14:35:17

标签: asp.net-mvc-3 extension-methods html.beginform

我正在编写一个自定义验证集,它将显示div上所有缺少的元素。我希望能够使用一个自定义的@Html.BeginForm()方法来写出那个div,但我真的不知道从哪里开始,因为这个坚果比一个html扩展写的更难解决out a Tag或String(表单封装了数据/控件,最后由}关闭)。

我查看了内置BeginForm()方法的元数据版本,但这对我没什么帮助。从本质上讲,我只想在可能的情况下扩展该方法,并让它写出一个MvcHtmlString的{​​{1}},它将在JavaScript中显示/隐藏。

最终我正在努力解决的问题是如何编写这个具有开始和结束组件的自定义助手。

div

我希望能够做到这样的事情:

@using(Html.BeginForm())
{
...

}

并让我的额外html

编辑:从下面的建议中添加代码

@using(Html.VBeginForm())
{
...

}

2 个答案:

答案 0 :(得分:6)

您需要为打印到HtmlHelper的{​​{1}}类编写扩展方法。

该方法应返回helper.ViewContext.Writer,以IDisposable方式打印结束标记。

答案 1 :(得分:4)

SLaks的回答是正确的,但缺少一些额外的信息。

如果要使用传统(非非显眼)客户端验证,则需要提供formContext,并为其提供一个id,以便客户端验证可以正常工作。在他的解释中,这部分缺失了。

实现此目的的最简单方法是使用返回MvcForm类的实例,该实例创建formContext,并实现IDisposable接口。

在此实现中,我需要提供表单的id:

public static MvcForm BeginFormDatosAdicionales(this HtmlHelper htmlHelper, 
   string id, ..., IDictionary<string, object> htmlAttributes = null)
{
  TagBuilder form = new TagBuilder("form");
  // attributes
  form.MergeAttributes(htmlAttributes);
  // action
  string formAction = ...;
  form.MergeAttribute("action", formAction);
  // method
  FormMethod method = ...;
  form.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
  // id
  form.MergeAttribute("id", id);

  // writes the form's opening tag in the ViewContext.Writer
  htmlHelper.ViewContext.Writer.Write(form.ToString(TagRenderMode.StartTag));

  // creates an MvcForm (disposable), which creates a FormContext, needed for
  // client-side validation. You need to supply and id for it
  MvcForm theForm = new MvcForm(htmlHelper.ViewContext);
  htmlHelper.ViewContext.FormContext.FormId = form.Attributes["id"];

  // The returned object implements IDisposable, and writes the closing form tag
  return theForm;
  }

当然,这可以根据您的具体情况进行定制。如果您只想在绝对必要时为您的表单提供ID,请查看此contidition:

bool idRequired = htmlHelper.ViewContext.ClientValidationEnabled
&& !htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled;

在这种情况下,您必须小心为页面中的每个表单创建不同的ID。例如,您可以添加一个整数后缀,该后缀可以存储在HttpContext.Items中,并在每次生成新Id时递增。这可以确保在单个页面中所有生成的ID都不同。

HttpContext.Current.Items["lastFormId"]