Asp.net mvc 在MVC2中重构表单
我发现自己在许多处理表单的视图上反复粘贴了这段代码。 是否有一种简单的方法可以从MVC2中的视图重构以下标记? 唯一改变的部分是取消链接的路由(LocalizedSaveButton和LocalizedCancelink是我创建的助手方法)。 我试图将其提取到PartialView,但我失去了BeginForm功能。有什么建议吗Asp.net mvc 在MVC2中重构表单,asp.net-mvc,asp.net-mvc-2,mvccontrib,t4mvc,Asp.net Mvc,Asp.net Mvc 2,Mvccontrib,T4mvc,我发现自己在许多处理表单的视图上反复粘贴了这段代码。 是否有一种简单的方法可以从MVC2中的视图重构以下标记? 唯一改变的部分是取消链接的路由(LocalizedSaveButton和LocalizedCancelink是我创建的助手方法)。 我试图将其提取到PartialView,但我失去了BeginForm功能。有什么建议吗 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div class="span-14">
<% Html.EnableClientValidation(); %>
<%using (Html.BeginForm())
{%>
<fieldset>
<legend>Edit Profile</legend>
<%=Html.AntiForgeryToken() %>
<%=Html.EditorForModel() %>
<div class="span-6 prepend-3">
<%=Html.LocalizedSaveButton() %>
<%=Html.LocalizedCancelLink(RoutingHelper.HomeDefault()) %>
</div>
</fieldset>
<%}%>
</div>
编辑配置文件
您可以将代码封装在一个Html扩展中,如BeginForm。从您的代码中调用BeginForm在正确的位置 您应该返回一个实现IDisposable的对象。在dispose中,调用dispose以通知存储结果 你最终会得到:
<% using (Html.MyBeginForm()) { %>
<%=Html.LocalizedSaveButton() %>
<%=Html.LocalizedCancelLink(RoutingHelper.HomeDefault()) %>
<% } %>
它会做一些类似于:
public class MyForm : IDisposable {
private MvcForm _form;
private ViewContext _ctx;
public MyForm(HtmlHelper html, /* other params */) {
_form = html.BeginForm();
_ctx = html.ViewContext;
}
public Dispose() {
_form.Dispose();
_ctx.Writer.Write("html part 3 => closing tags");
}
}
及延长期限:
public static MyForm MyBeginForm(this HtmlHelper html /* other params */) {
html.ViewContext.Writer.Write("html part 1");
var result = new MyForm(html);
html.ViewContext.Writer.Write("html part 2");
return result;
}
免责声明:这是未经测试的代码。以下是我的想法: 它基本上可以工作,但我无法让Html.EnableClientValidation()与呈现的表单协作
namespace System.Web.Mvc
{
public class MyForm : IDisposable
{
private bool _disposed;
private readonly HttpResponseBase _httpResponse;
public MyForm(HttpResponseBase httpResponse)
{
if (httpResponse == null)
{
throw new ArgumentNullException("httpResponse");
}
_httpResponse = httpResponse;
}
public void Dispose()
{
Dispose(true /* disposing */);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
_disposed = true;
_httpResponse.Write("</form>");
}
}
public void EndForm()
{
Dispose(true);
}
}
}
public static class MyFormExtensions
{
public static MyForm FormHelper(
this HtmlHelper htmlHelper,
string formAction,
FormMethod method,
IDictionary<string, object> htmlAttributes,
string formLegendTitle)
{
TagBuilder tagBuilder = new TagBuilder("form");
tagBuilder.MergeAttributes(htmlAttributes);
tagBuilder.MergeAttribute("action", formAction);
tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag));
return new MyForm(httpResponse);
}
public static MyForm MyBeginForm(this HtmlHelper html, string formLegendTitle) {
string formAction = html.ViewContext.HttpContext.Request.RawUrl;
var result = FormHelper(html,formAction, FormMethod.Post, null, formLegendTitle );
html.ViewContext.Writer.Write("<fieldset>");
html.ViewContext.Writer.Write(String.Format("<legend>{0}</legend>", formLegendTitle));
html.ViewContext.Writer.Write("<div class=\"span-14\">");
html.ViewContext.Writer.Write(html.AntiForgeryToken());
html.ViewContext.Writer.Write(html.EditorForModel());
html.ViewContext.Writer.Write("<div class=\"span-6 prepend-3 buttons\">");
html.ViewContext.Writer.Write(html.LocalizedSaveButton());
html.ViewContext.Writer.Write("</div>");
html.ViewContext.Writer.Write("</div>");
html.ViewContext.Writer.Write("</fieldset>");
return result;
}
public static void EndForm(this HtmlHelper htmlHelper)
{
HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
httpResponse.Write("</form>");
}
}
namespace System.Web.Mvc
{
公共类MyForm:IDisposable
{
私人住宅;
私有只读HttpResponseBase_httpResponse;
公共MyForm(HttpResponseBase httpResponse)
{
if(httpResponse==null)
{
抛出新ArgumentNullException(“httpResponse”);
}
_httpResponse=httpResponse;
}
公共空间处置()
{
处置(真实/*处置*/);
总干事(本);
}
受保护的虚拟void Dispose(bool disposing)
{
如果(!\u已处置)
{
_这是真的;
_httpResponse.Write(“”);
}
}
公共无效尾形()
{
处置(真实);
}
}
}
公共静态类MyFormExtensions
{
公共静态MyForm FormHelper(
这个HtmlHelper HtmlHelper,
弦的形成,
FormMethod方法,
我的辞典,
字符串格式(LegendTitle)
{
TagBuilder TagBuilder=新的TagBuilder(“表格”);
tagBuilder.MergeAttributes(HtmlatAttributes);
tagBuilder.MergeAttribute(“动作”,形式);
tagBuilder.MergeAttribute(“方法”,HtmlHelper.GetFormMethodString(方法),true);
HttpResponseBase httpResponse=htmlHelper.ViewContext.HttpContext.Response;
httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag));
返回新的MyForm(httpResponse);
}
公共静态MyForm MyBeginForm(此HtmlHelper html,字符串formLegendTitle){
string formAction=html.ViewContext.HttpContext.Request.RawUrl;
var result=FormHelper(html、formAction、FormMethod.Post、null、formLegendTitle);
html.ViewContext.Writer.Write(“”);
Write(String.Format(“{0}”,formLegendTitle));
html.ViewContext.Writer.Write(“”);
html.ViewContext.Writer.Write(html.AntiForgeryToken());
html.ViewContext.Writer.Write(html.EditorForModel());
html.ViewContext.Writer.Write(“”);
html.ViewContext.Writer.Write(html.LocalizedSaveButton());
html.ViewContext.Writer.Write(“”);
html.ViewContext.Writer.Write(“”);
html.ViewContext.Writer.Write(“”);
返回结果;
}
公共静态void EndForm(此HtmlHelper HtmlHelper)
{
HttpResponseBase httpResponse=htmlHelper.ViewContext.HttpContext.Response;
httpResponse.Write(“”);
}
}
太棒了!让我试一试。
namespace System.Web.Mvc
{
public class MyForm : IDisposable
{
private bool _disposed;
private readonly HttpResponseBase _httpResponse;
public MyForm(HttpResponseBase httpResponse)
{
if (httpResponse == null)
{
throw new ArgumentNullException("httpResponse");
}
_httpResponse = httpResponse;
}
public void Dispose()
{
Dispose(true /* disposing */);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
_disposed = true;
_httpResponse.Write("</form>");
}
}
public void EndForm()
{
Dispose(true);
}
}
}
public static class MyFormExtensions
{
public static MyForm FormHelper(
this HtmlHelper htmlHelper,
string formAction,
FormMethod method,
IDictionary<string, object> htmlAttributes,
string formLegendTitle)
{
TagBuilder tagBuilder = new TagBuilder("form");
tagBuilder.MergeAttributes(htmlAttributes);
tagBuilder.MergeAttribute("action", formAction);
tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag));
return new MyForm(httpResponse);
}
public static MyForm MyBeginForm(this HtmlHelper html, string formLegendTitle) {
string formAction = html.ViewContext.HttpContext.Request.RawUrl;
var result = FormHelper(html,formAction, FormMethod.Post, null, formLegendTitle );
html.ViewContext.Writer.Write("<fieldset>");
html.ViewContext.Writer.Write(String.Format("<legend>{0}</legend>", formLegendTitle));
html.ViewContext.Writer.Write("<div class=\"span-14\">");
html.ViewContext.Writer.Write(html.AntiForgeryToken());
html.ViewContext.Writer.Write(html.EditorForModel());
html.ViewContext.Writer.Write("<div class=\"span-6 prepend-3 buttons\">");
html.ViewContext.Writer.Write(html.LocalizedSaveButton());
html.ViewContext.Writer.Write("</div>");
html.ViewContext.Writer.Write("</div>");
html.ViewContext.Writer.Write("</fieldset>");
return result;
}
public static void EndForm(this HtmlHelper htmlHelper)
{
HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
httpResponse.Write("</form>");
}
}