2011-09-20 152 views
1

我正在研究使用Razor在MVC3中使用部分视图,并且我获得了部分视图来呈现,并且工作正常。 但是,我想要做的是在部分视图提交时刷新父视图。当提交部分视图的表单时刷新父视图

代码在我父视图呈现局部视图

<div id="mydiv"> 
@{ Html.RenderAction("Add", "Request"); } 
</div> 

父视图操作简单,

public ActionResult Index() 
{ 
    List<obj> reqs = //some query 
    return View(reqs); 
} 

在我的部分观点的取得动作,我有:

public ActionResult Add() 
{ 
    AddRequestViewModel vm = new AddRequestViewModel(); 
    //set some stuff on the VM here 
    return PartialView(vm); 
} 

在部分视图调用的后处理操作中,如果modelstate无效,则return PartialView(vm)

如果它是有效的,我想要刷新父视图和部分视图。 我尝试RedirectToAction,但这不能由部分,显然,我试图return Index();称为一个动作被调用,而这会导致用于呈现局部视图代码中的问题,

Exception Details: System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Collections.Generic.List'1[DatRequests.Models.ReqRequest]', but this dictionary requires a model item of type 'DatRequests.ViewModels.AddRequestViewModel'.

如何做到这一点的任何建议,将不胜感激。页面的目的是显示一个元素列表,并且partial包含一个向列表中添加一个新元素的表单。

Edit:该部分的模型是不同的,因为它包含选择数据,这是从数据库,这就是为什么我尝试了RenderAction,但我不知道是否有其他方式做到这一点。

+1

我没有看到你在这种情况下需要Ajax请求。 –

回答

1

当部分视图正常提交时,您将其提交给某个控制器操作。您可以使用普通请求或AJAX请求提交。如果您使用正常请求,则可以执行标准重定向至POST控制器操作中的Index,以处理表单提交。如果使用AJAX,你可以返回指向要重定向的URL JSON结果:

[HttpPost] 
public ActionResult Foo(MyViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return PartialView(model); 
    } 
    return Json(new { url = Url.Action("Index") }); 
} 

和你的AJAX成功回调中:

success: function(result) { 
    if (result.url) { 
     // we have a success 
     window.location.href = result.url; 
    } else { 
     // invalid modelstate => refresh the partial 
     $('#mydiv').html(result); 
    } 
} 
1

大概的RenderAction不应该使用这种方法。

使用Html.RenderAction时,会向服务器发送新的/单独的请求。而且你还有机会从数据库或其他地方加载一些数据以显示给客户端。另外,您可以将OutputCache应用于此操作。这通常是做全局缓存的方式。

在这里你正在做一个POST到服务器。要么直接在这里放置一个元素,要么使用局部视图来做Post。并在相应的操作中,执行RedirectToAction。

用ajax来做它不是重点。我的意见更多关于使用RenderAction的正确方法

+0

我使用Html.RenderAction,因为我确实需要从数据库加载一些数据以显示给客户端。局部视图与父页面的视图有不同的模型。我想以适当的方式做事情,或者更为接受的方式;我只是不确定这是什么。 – damienc88

+0

数据加载不能由父视图完成的任何原因? – fengd