我试图弄清楚在以下场景中如何将模型对象从控制器传递到视图:
<% 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 });
}
答案 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 = 12
和email = "foo@bar"
以及所有其他相关部分来创建“请求”对象,或者在部分视图名为“请求”。
即。 ViewData["SomeRequest"]= dbRepository.GetRequestById(intrequestId);
,请致电Html.RenderPartial("Request", ViewData["SomeRequest"]);