我在从不同视图发布表单时遇到问题...我使用相同的表单,它将在一个视图中工作,但不在另一个视图中工作。当它在帖子中出错时,参数将作为null传递。这是我的表格:
<% using (Html.BeginForm()) { %>
<table>
<tr>
<td colspan="4" style="line-height:20px;"><label for="Search.searchString">Search</label></td>
</tr>
<tr>
<td><%= Html.TextBox("Search.searchString") %>
</td>
<td><label for="Search.category"><nobr>In Category</nobr></label></td>
<td><%= Html.TextBox("Search.category") %></td>
<td><input type="submit" value="Search" /></td>
</tr>
</table>
<% } %>
我有2个视图...索引和搜索视图。当我从索引视图发布此表单时,它工作正常。当我从搜索视图发布它时,它告诉我我的搜索对象为空。这是我的帖子方法:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(Search search)
{
if (String.IsNullOrEmpty(search.searchString))
search.searchString = "all";
return RedirectToRoute("search", new RouteValueDictionary { { "search", search.searchString }, { "category", search.category } });
}
索引和搜索的post方法是相同的,所以我很困惑为什么一个工作而另一个不工作。有什么想法吗?谢谢你的帮助!
答案 0 :(得分:0)
您的第二个视图是继承自搜索对象还是视图模型是否继承自搜索对象?
所以你的索引视图<namespace.SearchObject>
和您的搜索<namespace.SearchObject>
如果搜索继承自<namespace.SearchView>
,那么您的SearchView必须从SearchObject继承。
答案 1 :(得分:0)
这是因为您的ActionResult方法与您传入的类型模型具有相同的名称。
尝试使用ActionName属性:
[ActionName("Search"), AcceptVerbs(HttpVerbs.Post)]
public ActionResult DoSearch(Search search)
{
return View();
}
答案 2 :(得分:0)
好的,我想我已经搞清楚了......我最终将html.beginform标签修改为以下内容......
using (Html.BeginForm("Index", "Home"))
并强制它始终使用index post方法,并且它可以工作。这是解决问题的最佳方法吗?