仅在HttpPost ActionHandler之后渲染部分视图

时间:2012-11-03 16:34:07

标签: c# asp.net asp.net-mvc

我正在使用HttpPost ActionHandler中的MyViewRequest视图字段进行WCF服务调用。目标是使用部分视图MyViewResponse

显示响应

简而言之,我需要实现这两个项目 -

  1. 首次加载时禁用部分视图加载。
  2. 在服务电话后显示响应(连同请求)。
  3. 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")
    

    使用userControl在Asp.Net中非常直接,但是在这里,我们怎样才能在MVC3中实现这一点。

1 个答案:

答案 0 :(得分: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的对象,并填充了propety值。可以从数据库或通过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});
  } 
}