MVC将Partial View保留在自己的上下文中 - 忽略保持局部视图的主视图

时间:2010-05-01 22:25:28

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

我正在查看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'),其中有表格,我可以得到它以便这些表格 发布到他们自己的动作和主视图(它继承的模型)也被处理。而不是让所有表单在视图的主要操作中提交代码。

我这样做错了吗?

2 个答案:

答案 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