在ASP.NET MVC中使用EditCreate.ascx partial编辑和创建视图

时间:2010-03-22 00:24:46

标签: asp.net-mvc partial-views

如果您查看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”)的能力。我们不能在那里使用硬编码值,因为在编辑视图中,此回发将失败或不会回发到正确的控制器操作。

在这种情况下我该怎么做?

2 个答案:

答案 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"})

干杯!