3

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

<%=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”呈现给页面。我怎样才能让它消失?

4

3 回答 3

6

1) 使用 FormCollection 作为参数:

public ActionResult List(FormCollection searchQuery)

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

2)从BeginForm中删除“=”:

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

也就是说,你真的应该使用,嗯......使用:

<% using (Html.BeginForm("List", "Building", FormMethod.Post)) { %>
<% } %>
于 2009-01-27T14:29:40.927 回答
0

如果我正确理解了您的问题,您可以使用 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;
   ...
}
于 2009-01-27T19:28:05.567 回答
0

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

还有 <% Html.EndForm(); %> 需要一个分号,我不确定我是否喜欢 :)

于 2009-01-28T03:28:01.197 回答