【问题标题】:Implementing Forms in ASP.net MVC在 ASP.net MVC 中实现表单
【发布时间】:2009-01-27 14:18:41
【问题描述】:

我在视图页面上有一个简单的表单,实现为用户控件,看起来像这样:

<%=Html.BeginForm("List", "Building", FormMethod.Post) %>

//several fields go here

<%Html.EndForm(); %>

我想解决两个问题,第一个是我希望接收这个的控制器方法接受用户控件的类型参数。目标是避免将表单的所有字段放入方法的参数列表中。控制器方法目前如下所示:

[AcceptVerbs("Post")]
    public ActionResult List(string capacityAmount)
    {
        ProfilerDataDataContext context = new ProfilerDataDataContext();
        IEnumerable<Building> result = context.Buildings.OrderBy(p => p.SchoolName);
        ViewData["Boroughs"] = new SelectList(Boroughs.BoroughsDropDown());

        return View(result);
    }

表单中的其余字段将用于针对建筑物类型进行搜索。

表单发布正常,我可以按照您期望的方式搜索容量,但是当我向搜索添加参数时,我可以闻到前面的丑陋。

其次,较小的问题是,当页面呈现 BeginForm 标签时,会将字符串“System.Web.Mvc.Form”呈现给页面。我怎样才能让它消失?

【问题讨论】:

    标签: c# .net asp.net-mvc forms views


    【解决方案1】:

    1) 使用 FormCollection 作为参数:

    public ActionResult List(FormCollection searchQuery)
    

    现在您可以迭代 FormCollection 并从您的搜索表单中获取键/值搜索词。

    2) 从 BeginForm 中删除“=”:

    <% Html.BeginForm("List", "Building", FormMethod.Post) %>
    

    也就是说,你should really be using,嗯...使用:

    <% using (Html.BeginForm("List", "Building", FormMethod.Post)) { %>
    <% } %>
    

    【讨论】:

    • 我正在使用您的使用建议,但控制器方法永远不会触发。我一定是错过了其他东西......
    • 提交时会发生什么
    • 如果什么都没发生,那么我会非常仔细地查看提交给服务器的内容。我通常为此使用萤火虫。如果表单没有提交任何内容或提交错误的内容,请检查您呈现的 HTML。
    • 我的错误是没有取消 EndForm 调用。控制器方法正确触发。非常感谢您的回答。
    【解决方案2】:

    如果我正确理解了您的问题,您可以使用 html 帮助程序并创建名为:

    <%=Html.TextBox("building.FieldNumber1")%>
    <%=Html.TextBox("building.FieldNumber2")%>
    

    您应该能够使用以下方式访问数据:

    public ActionResult List(Building building)
    {
       ...
       var1 = building.FieldNumber1;
       var2 = building.FieldNumber2;
       ...
    }
    

    如果您的操作是根据是否提交表单来做两件不同的事情:

    public ActionResult List()
    {
        //some code here
    }
    
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult List(Building building)
    {
       ...
       var1 = building.FieldNumber1;
       var2 = building.FieldNumber2;
       ...
    }
    

    【讨论】:

      【解决方案3】:

      如果有人对 Html.BeginForm 的整个“使用”模式持怀疑态度 - 请意识到 IDE 足够聪明,可以将开头的 '{' 与结尾的 '}' 匹配起来,这使得很容易看到表单从哪里开始并结束。

      还有 需要一个分号,我不确定我是否喜欢 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 2011-02-14
        • 2013-05-07
        相关资源
        最近更新 更多