0

我正在使用 HttpPost ActionHandler 中的 MyViewRequest 视图字段进行 WCF 服务调用。目标是使用局部视图显示响应,MyViewResponse

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

  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 中使用 userControl 非常简单,但是在这里卡住了,我们如何在 MVC3 中实现这一点。

4

1 回答 1

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行动中,你提出了问题。从 url 获取 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. 我写了2个方法让它更清楚。

现在在您的显示视图中

@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)
}

并且您的 Partial 视图将被强类型化为一个集合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});
  } 
}
于 2012-11-03T16:59:56.767 回答