仅将ViewModel的一个对象传递给控制器

时间:2012-05-30 20:27:28

标签: asp.net-mvc

我有一个Home ViewModel类,其中包含其他类:

public class HomeVM
{
    public ProductSearchRequest ProductSearchRequest { get; set; }
    //Other class
    //Other class
    //Other class
}

我的主页/索引视图有@model HomeVM,我有一个搜索文本输入:

@using (Html.BeginForm("Search", "Product"))
{
    @Html.TextBoxFor(m => m.ProductSearchRequest.SearchText)
    <input type="submit" value="Search" />
}

但在我的产品/搜索中,我只需要接收ProductSearchRequest,因为还有其他页面使用其他ViewModel但包含ProductSearchRequest。

我正在尝试这个:

public ActionResult Search(ProductSearchRequest request)
{
    var response = new ProductSearchResponse
    {
        SearchText = request.SearchText,
        Products = GetProductsByName(request.SearchText)
    };

    return View(response);
}

但它不起作用.. request.SearchText始终为null ..

我该怎么做?

2 个答案:

答案 0 :(得分:3)

这只是一个黑暗的刺,但你的行动,尝试调用参数'ProductSearchRequest'

或者如何将整个表单放在该操作的视图中。 “搜索”将“ProductSearchRequest”作为模型?

答案 1 :(得分:1)

您遇到的问题是因为TextBoxFor()将使用命名约定创建html输入,该命名约定应与原始操作绑定到相同类型的模型HomeVM

您可以尝试使用简单的TextBox()辅助方法,如下所示:

@Html.TextBox("SearchText", Model.ProductSearchRequest.SearchText)

为了避免使用字符串值,您可以创建一个单独的表单partial,将ProductSearchRequest对象作为模型,并调用:

@Html.RenderPartial("SearchForm",Model.ProductSearchRequest)

现在你可以在partial:

中使用这样的TextBoxFor()方法
@Html.TextBoxFor(m => m.SearchRequest)