如果您查看NerdDinner创建和编辑晚餐的示例,那么您会看到他们使用部分(ViewUserControl或ASCX)DinnerForm将创建和编辑晚餐的功能放入一个文件中,因为它是必不可少的并且他们使用它使用RenderPartial(“DinnerForm”)。
这种方法对我来说似乎不错,但我遇到了一个问题,你必须在Form标签中添加额外的路由值或html属性。
这会自动获取当前操作和控制器:
<% using (Html.BeginForm()) { %>
但是,如果我使用另一个允许传入enctype或任何其他属性的BeginForm()重载,我必须这样做:
<% using ("Create", "Section", new { modal = true }, FormMethod.Post, new { enctype = "multipart/form-data" }))
正如您所看到的,我们失去了自动检测我们在哪个View中调用RenderPartial(“OurCreateEditFormPartial”)的能力。我们不能在那里使用硬编码值,因为在编辑视图中,此回发将失败或不会回发到正确的控制器操作。
在这种情况下我该怎么做?
答案 0 :(得分:3)
如何添加以下HTML帮助程序:
public static MvcHtmlString CurrentAction(this HtmlHelper htmlHelper)
{
return htmlHelper.ViewContext.RouteData.Values["action"];
}
public static MvcHtmlString CurrentController(this HtmlHelper htmlHelper)
{
return htmlHelper.ViewContext.RouteData.Values["controller"];
}
然后你可以这样:
<% using (Html.CurrentAction, Html.CurrentController, new { modal = true }, FormMethod.Post, new { enctype = "multipart/form-data" }))
它不是100%完美,但您还可以添加一个额外的HTML帮助程序,这将简化它:
public static MvcForm BeginForm(this HtmlHelper htmlHelper, object routeValues, FormMethod method, object htmlAttributes)
{
return htmlHelper.BeginForm(Html.CurrentAction, Html.CurrentController, routeValues, method, htmlAttributes);
}
如果这有帮助,请告诉我。 干杯
答案 1 :(得分:0)
我正在回答一个旧帖子,因为它在谷歌搜索中排名第二,而我正在寻找同样的东西:)发现在这个SO帖子上:
Html.BeginForm and adding properties
使用MVC3(不确定MVC2),您可以为操作和控制器传递null,并获取BeginForm()将使用的默认路由。
@Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data"})
干杯!