2011-09-20 120 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