MVC将模型对象从控制器传递到视图

时间:2010-10-29 14:08:09

标签: asp.net-mvc

我试图弄清楚在以下场景中如何将模型对象从控制器传递到视图:

<% Html.Action("GetRequest", "The_Controller", new { requestId = 12 }); %>
<% Html.RenderPartial("Request", ViewData.Model); %>

该操作应该并且确实调用控制器的方法,该方法在DB存储库中查找Request对象并返回Request对象。

名为Request的局部视图应该接收请求对象并显示它。

问题是ViewData.Model总是为空?!

我试图解决这个问题,但没有成功:(

这种行为的原因是我需要根据jQGrid提供的requestId值在jQuery的模态对话框中显示局部视图。我已经达到了打开对话框但无法获取该模型对象实例的程度。

感谢任何帮助。

解决方案 - 在Nick Larsen和Darin Dimitrov的帮助下

控制器:

    [AcceptVerbs(HttpVerbs.Post)]
    [Authorize]
    public PartialViewResult GetRequest(string requestId)
    {
        Request request = DatabaseContext.GetRequest(Convert.ToInt32(requestId)) as Request;
        return PartialView("Request", request);
    }

视图的Javascript:

function OpenRequest(requestId) {

        var methodName = '<%= Url.Content("~")%>' + 'Controller/GetRequest/';
        var dataType = "html";
        var postData = { requestId: requestId };
        var contentType = "application/x-www-form-urlencoded"; ;
        var request = ContactServer(methodName, postData, dataType, contentType);

        $("#dialog").html(request);
        $("#dialog").dialog({ html: request, title: 'Request details...', width: 800, height: 600, modal: true, zindex: 300000, show: 'scale', resizable: false });

    }

3 个答案:

答案 0 :(得分:2)

您可以让控制器操作返回局部视图:

<%= Html.Action("GetRequest", "The_Controller", new { requestId = 12 }) %>

在你的控制器动作中:

public ActionResult GetRequest(int requestId)
{
    var request = _repository.GetRequest(requestId);
    return PartialView("Request", request);
}

这样GetRequest操作会将请求对象传递给强类型Request.ascx局部视图,并将其包含在您调用Html.Action帮助器的位置的页面中。

答案 1 :(得分:1)

最好将其设置在视图不会调用控制器的位置。在调用此视图的操作中加载请求的所有数据,并使用所需数据填充视图模型。完成后,从模型中渲染字段。

至于你的实际问题。首先调用此视图的操作会为其上下文填充ViewData.Model。当你调用action方法时,框架正在创建一个带有自己的ViewData的新上下文,你无法访问它而没有新创建的上下文的句柄。

答案 2 :(得分:1)

您可能已经预先获得了所有必要信息,以便在初始控制器操作方法中创建“请求”对象。

建议:

  • 完全放弃<% Html.Action("GetRequest", "The_Controller", new { requestId = 12 }); %>。我们将使用发送到Partial所需的所有数据预填充ViewData。

  • 在您的初始控制器方法中,您创建了一个新的ViewData条目,可能是ViewData["SomeRequest"]

  • 根据您的需要预先填充初始控制器方法,使用requestId = 12email = "foo@bar"以及所有其他相关部分来创建“请求”对象,或者在部分视图名为“请求”。

    即。 ViewData["SomeRequest"]= dbRepository.GetRequestById(intrequestId);

  • 在您的视图中
  • ,请致电Html.RenderPartial("Request", ViewData["SomeRequest"]);