在一个请求中使用相同的模型两次

时间:2013-04-09 19:20:43

标签: asp.net-mvc-4

你可以在asp.net MVC4的一个请求中使用相同的模型作为参数两次吗?

我有

public ActionResult Search(SearchModel model) 
{
    SearchResults resultsModel = new SearchResults();

    resultsModel.Results = new List<string>();
    resultsModel.Results.Add("posted value : " + model.Phrase);

    return View("SearchResults", resultsModel);
}

[ChildActionOnly]
public ActionResult SearchPartial(SearchModel model) 
{
    model.Phrase = "changed in search partial";

    return PartialView("_SearchPartial", model);
}

我在@Html.Action("SearchPartial")中执行了_Layout,cshtml但无论我发布到第一种方法,当任何页面在第二种方法上调用@HtmlAction时,模型永远不会被发送使用字符串“在搜索部分中更改”的客户端。

就像我在同一个请求中调用两个动作一样,我不能两次使用相同的模型。哪个真烦人....

我甚至改变了第一种方法只使用1个参数,但它总是只返回发布的内容而不是我将其设置为服务器端!!!

2 个答案:

答案 0 :(得分:0)

当您使用@Html.Action("SearchPartial")拨打电话时,它会将其视为对名为SearchPartial的操作的全新请求,但它不会隐式地从父操作中继承任何模型或TempData。你必须自己做。

  

编辑:根据Chris在下面的评论中提到的内容,ChildAction会尝试使用以下注释绑定其输入模型   传递给父Action的参数。

@Html.Action("SearchPartial", new {model = Model})

然而,当我过去做过这个时,我会传递原始数据而不是完整的对象,所以你可能不得不这样做。

@Html.Action("SearchPartial", new {phrase = Model.Phrase, page = Model.Page, perPage = Model.PerPage})`

注意:我只是猜测SearchModel ViewModel上的属性。

答案 1 :(得分:0)

这应该可以正常工作。我刚刚测试了以下内容:

<强>控制器:

public ActionResult Search(SearchModel model) 
{
    SearchResults resultsModel = new SearchResults();

    resultsModel.Results = new List<string>();
    resultsModel.Results.Add("posted value : " + model.Phrase);

    return View("SearchResults", resultsModel);
}

[ChildActionOnly]
public ActionResult SearchPartial(SearchModel model) 
{
    model.Phrase = "changed in search partial";

    return PartialView("_SearchPartial", model);
}

<强>型号:

public class SearchModel
{
    public string Phrase { get; set; }
}

public class SearchResults
{
    public List<string> Results { get; set; }
}

<强> SearchResults.cshtml:

@model SearchResults

@foreach (var item in Model.Results) {
    <div>@item</div>
}

<强> _SearchPartial.cshtml:

@model SearchModel
<strong>Search Phrase:</strong> @Model.Phrase

<强> _Layout.cshtml:

<!DOCTYPE html>
<html lang="en">
    <body>
        <div>
            <h2>Partial Contents</h2>
            @Html.Action("SearchPartial", "Home")
        </div>
        <div>
            <h2>Body Contents</h2>
            @RenderBody()
        </div>
    </body>
</html>

结果(查询字符串:“?phrase = Test”):

<!DOCTYPE html>
<html lang="en">
    <body>
        <div>
            <h2>Partial Contents</h2>
            <strong>Search Phrase:</strong> changed in search partial
        </div>
        <div>
            <h2>Body Contents</h2>
            <div>posted value : Test</div>
        </div>
    </body>
</html>