代码之家  ›  专栏  ›  技术社区  ›  griegs

PartialView动态BeginInform参数

  •  2
  • griegs  · 技术社区  · 14 年前

    如果我有下面的部分视图

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Models.Photo>" %>
    
    <% using (Html.BeginForm("MyAction", "MyController", FormMethod.Post, new { enctype = "multipart/form-data" }))   { %>
    
        <%= Html.EditorFor( c => c.Caption ) %>
    
        <div class="editField">
            <label for="file" class="label">Select photo:</label>
            <input type="file" id="file" name="file" class="field" style="width:300px;"/>
        </div>
    
      <input type="submit" value="Add photo"/>
    
    <%} %>
    

    如您所见,操作和控制器是硬编码的。有什么方法可以让它们充满活力吗?

    我的目标是让这个局部视图足够通用,我可以在许多地方使用它,并将它提交给它所在的操作和控制器。

    我知道我可以使用VIEWDATA,但确实不想这样做,同样,我也不想将vormview模型传递给视图,并且使用模型属性。

    有没有比我上面列出的两个更好的方法?

    1 回复  |  直到 14 年前
        1
  •  1
  •   ali62b    14 年前

    我检查了mvc的源代码,并深入研究了system.web.mvc-->mvc-->html-->formExtensions,这样您就可以编写以下代码:

    public static class FormHelpers
    {
        public static MvcForm BeginFormImage(this HtmlHelper htmlHelper,  IDictionary<string, object> htmlAttributes)
        {
            string formAction = htmlHelper.ViewContext.HttpContext.Request.RawUrl;
            return FormHelper(htmlHelper, formAction, FormMethod.Post, htmlAttributes);
        }
    
        public static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
        {
            TagBuilder tagBuilder = new TagBuilder("form");
            tagBuilder.MergeAttributes(htmlAttributes);
            // action is implicitly generated, so htmlAttributes take precedence.
            tagBuilder.MergeAttribute("action", formAction);
            tagBuilder.MergeAttribute("enctype", "multipart/form-data");
            // method is an explicit parameter, so it takes precedence over the htmlAttributes.
            tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
            htmlHelper.ViewContext.Writer.Write(tagBuilder.ToString(TagRenderMode.StartTag));
            MvcForm theForm = new MvcForm(htmlHelper.ViewContext);
    
            if (htmlHelper.ViewContext.ClientValidationEnabled)
            {
                htmlHelper.ViewContext.FormContext.FormId = tagBuilder.Attributes["id"];
            }
    
            return theForm;
        }
    }
    

    我不确定这正是你真正想要的,但我相信如果你改变这条线来满足你的需要,你可以得到它。 希望这有帮助。