我正在查看MVC框架的partialview组件。
我希望我的部分视图可以在自己的操作中处理,并且视图的其余部分可以自行处理,但是我得到一个例外,因为主页面没有触发它的视图。
我是以错误的方式解决这个问题吗?
我的主视图(Jobs / Index.aspx):
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication3.Models.JobViewModel>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% Html.RenderPartial("JobListing", Model.Jobs); %>
</asp:Content>
部分视图(Jobs / JobListing.ascx):
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<MvcApplication3.Models.Job>>" %>
<table>
<tr>
<td> Job Title </td>
<td> Job Location</td>
</tr>
<%
foreach (var job in Model)
{
%>
<tr>
<td>
<%= job.Title %>
</td>
<td>
<%= job.Location %>
</td>
</tr>
<%
}
%>
<% Html.BeginForm("DoSomeStuff", "Job", null, FormMethod.Post); %>
<%= Html.TextBox("SomeInfo") %>
<button type="submit" id="submit" />
<% Html.EndForm(); %>
主视图(索引)和部分视图(DoSomeStuff())的主控制器
public class JobController : Controller
{
public ActionResult Index()
{
JobProvider provider = new JobProvider(Session);
JobViewModel vm = new JobViewModel();
vm.Jobs = provider.GetJobs();
return View(vm);
}
public PartialViewResult DoSomeStuff()
{
return PartialView("JobListing");
}
}
正如您在局部视图中看到的,它有自己的形式,发布到名为DoSomeStuff()的Action。我希望此操作处理从该表单提交的任何数据。 但是当提交表单时,主要操作(索引)不会触发,然后我得到一个异常,因为模型(.Models.JobViewModel)没有传递给部分视图(JobListings)所在的视图。
基本上我说的是,如果我有一个myview.aspx,其中有很多html.RenderPartialView('apartialview'),其中有表格,我可以得到它以便这些表格 发布到他们自己的动作和主视图(它继承的模型)也被处理。而不是让所有表单在视图的主要操作中提交代码。
我这样做错了吗?答案 0 :(得分:1)
我会遵循POST-REDIRECT-GET模式并定义DoSomeStuff,如:
public class JobController : Controller
{
[HttpPost]
public RedirectToRouteResult DoSomeStuff(DoSomeStuffModel model)
{
//Do some stuff with model
return RedirectToAction("Index");
}
}
如果您不想重新加载整个表单,可以使用jQuery Form Plugin。如果您使用它,您可以使用PartialViewResult
。发布部分视图表单后,如果指定target
选项,则包含部分视图代码的div内容将替换为返回的html。
答案 1 :(得分:1)
是否正在调用DoSomeStuff()动作?
如果是这样,它就不起作用就不足为奇了。 RenderPartial是直接调用部分页面而不需要控制器操作。但也许因为存在它正在调用该方法。但是,该方法不会接收作业,也不会将模型传递回视图,因此无法获取视图模型。
实际上,如果您不需要执行操作,则应该使用RenderPartial。如果你这样做,你应该使用Html.RenderAction或Html.Action