我正在使用HttpPost ActionHandler中的MyViewRequest视图字段进行WCF服务调用。目标是使用部分视图MyViewResponse
简而言之,我需要实现这两个项目 -
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中实现这一点。
答案 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});
}
}