没有帮助程序的形式的MVC3 ViewModel只有空值

时间:2012-07-06 15:48:09

标签: asp.net-mvc-3

我有一个与强类型ViewModel绑定的视图,但我使用MVC3 HTML帮助程序,只是普通的HTML input标记。但是,这似乎没有正确地将值传递给action方法,因为ViewModel完全为null。

视图模型:

class QuoteSearch {
    public long? CustomerId { get; set; }
    public string CustomerFirstName { get; set; }
    public string CustomerLastName { get; set; }
}

查看:

@model QuoteSearch

<form action="/quotes/search" method="POST">
    <p>Customer ID: <input id="CustomerIdField" name="CustomerId" type="text" /></p>
    <p>Customer First Name: <input id="CustomerFirstNameField" name="CustomerFirstName" type="text"/></p>
    <p>Customer Last Name: <input id="CustomerLastNameField" name="CustomerLastName" type="text"/></p>
    <p><button id="SearchButton" type="submit">Search</button></p>
</form>

控制器:

 [HttpPost]
 public ActionResult Search(QuoteSearch search) { 
     // checking if fields are set here.
 }

我似乎记得有一种方法可以不使用Html助手,但仍然使用强类型模型(而不是FormCollection);我认为这涉及将name属性设置为模型上属性的确切名称,但我似乎错了。

2 个答案:

答案 0 :(得分:1)

您的名称并非全部对齐(如注释中所示),但对于排队的字段,在执行上述代码时会正确填充模型(名称在那里,CustomerId为null)。

您是否设置了断点,并且知道代码被命中了吗?

还请确认您的控制器名为Quotes。即使它是,你最好使用:

<form action="@Url.Action("search", "quotes")" method="POST">

...即使您添加区域等,路由仍然有效.Url帮助程序将根据您的路由规则计算出请求的正确路径。

最后,如果您没有使用断点设置执行该执行点,请务必使用F12 / dev工具监视您的网络请求并确保调用正确的地址。上面的代码片段也应该有助于解决这个问题。

希望有所帮助。

答案 1 :(得分:0)

尝试name =“[ViewModel]。[FieldName]”和id =“[ViewModel] _ [FieldName]”

这些是我在使用HTML帮助程序时输入标记中的值。

所以对你来说就是:

<input type="text" name="QuoteSearch.CustomerId" id="QuoteSearch_CustomerId" />

等。