2012-11-03 69 views
0

我使用HttpPost ActionHandler中的MyViewRequest視圖字段進行WCF服務調用。我們的目標是使用局部視圖來顯示響應,MyViewResponse僅在HttpPost ActionHandler後呈現部分視圖

總之我需要實現第一次加載局部視圖的這兩種物品─

  1. 禁用負載。
  2. 服務呼叫後顯示響應(與請求一起)。

MyViewRequest.cshtml

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(false) 
    //html code 
} 
</div> 
<div id="dvResponse"> 
    @Html.Partial("MyViewResponse"); 
</div> 

局部視圖:MyViewResponse.cshtml

@model MvcApplication3.Models.MyModel 
@{ 
    ViewBag.Title = "MyViewResponse"; 
} 

<h2>MyView</h2> 

@Html.Label(Model.MyName, "My Name") 

這是非常簡單的在Asp.Net使用用戶控件,但在這裏卡住了,我們如何在MVC3中實現這一點。

+0

在什麼情況下你想做WCF調用並顯示響應? – Shyju

+0

@Shyju我在'HttpPost' ActionHandler中進行了serivce調用,並且當前顯示了默認視圖。即'返回查看()' – Abhijeet

回答

2

我認爲最好的方法是使用ViewModels來傳輸數據。讓我們假設你想要一個應用程序,像stackoverflow,你有一個問題,用戶可以發佈一個答案,它會顯示在帖子後面的問題。

public class PostViewModel 
{ 
    public int ID { set;get;} 
    public string Text { set;get;} 
    public List<PostViewModel> Answers { set;get;} 
    public string NewAnswer { set;get;} 
} 

在您的GET操作中,您將顯示該問題。從網址獲取ID,並從服務/存儲庫中獲取問題詳細信息。

public ActionResult Show(int id) 
{ 
    var post=new PostViewModel(); 
    post=yourService.GetQuestionFromID(id); 
    post.Answers=yourService.GetAnswersFromQuestionID(id); 
    return View(post); 
} 

假設yourService.GetQuestionFromID方法返回PostViewModel的目的與填充在歡迎使用屬性值。數據可以從數據庫中獲取,也可以通過WCF服務調用獲取。它是由你決定。另外yourService.GetAnswersFromQuestionID方法返回一個PostViewModel列表來表示該問題的答案。您可以將這兩種方法放在一個名爲GetQuestionWithAnswers的方法中。我寫了兩種方法使其更加清晰。

在顯示視圖

@model PostViewModel 
@Html.LabelFor(x=>x.Text); 
@using(Html.Beginform()) 
{  
    @Html.HiddenFor(x=>x.ID);  
    @Html.TextBoxFor(x=>x.NewAnswer) 
    <input type="submit" /> 
} 
<h3>Answers</h3> 
@if(Model.Answers!=null) 
{ 
    @Html.Partial("Responses",Model.Answers) 
} 

而且你的局部視圖

現在將被強類型到PostViewModel

@model List<PostViewModel> 
@foreach(var item in Model) 
{ 
    <div> @item.Text </div> 
} 

收集處理回發簡單(HttpPost)

[HttpPost] 
public ActionResult Show(PostViewModel model) 
{ 
    if(ModelState.IsValid) 
    { 
    //get your data from model.NewAnswer property and save to your data base 
    //or call WCF method to save it. 
    //After saving, Let's redirect to the GET action (PRG pattern) 
    return RedirectToAction("Show",new { @id=model.ID}); 
    } 
} 
+1

謝謝。有1個問題,建議我創建一個'ViewModel',其中包含'Request'和'Response'。回發時,我填充了ViewModel的Response對象並再次呈現相同的視圖。空檢查評估爲真('Model.Answers!= null')。部分視圖被渲染。 – Abhijeet

+0

我的請求模型包含一個'DropDownDist',回發後我期待它的值被重置。但用戶選擇仍然存在......我認爲MVC本質上是無狀態的。在這種情況下,國家如何維持? – Abhijeet

+0

回發後,我沒有重新填充'ViewModel'的'Request'對象。 – Abhijeet