ASP.NET MVC:如何在索引视图中创建一个部分视图?

问题描述:

我有一个索引视图网格,我想在底部创建一个局部视图 - 这样用户可以在同一页面上创建一个新项目来查看所有项目。但是,在提交部分创建视图时,主索引页面没有任何反应;它不会更新新项目(尽管它在刷新后会在那里更新)。ASP.NET MVC:如何在索引视图中创建一个部分视图?

索引页:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Paris.Domain.Models.PhoneNumberType>>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Index 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Index</h2> 
    <table> 
     <tr> 
      <th></th> 
      <th> 
       PhoneNumberTypeID 
      </th> 
      <th> 
       Name 
      </th> 
     </tr> 

    <% foreach (var item in Model) { %> 

     <tr> 
      <td> 
       <%: Html.ActionLink("Edit", "Edit", new { id=item.PhoneNumberTypeID}) %> | 
       <%: Html.ActionLink("Delete", "Delete", new { id=item.PhoneNumberTypeID })%> 
      </td> 
      <td> 
       <%: item.PhoneNumberTypeID %> 
      </td> 
      <td> 
       <%: item.Name %> 
      </td> 
     </tr> 

    <% } %> 
    </table> 

    <p> 
     Create New 
    </p> 
    <% Html.RenderAction("Create"); %> 

</asp:Content> 

这里是控制器:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Paris.Domain.Access; 

namespace Paris.Web.Areas.Domain.Controllers 
{ 
    public class PhoneNumberTypesController : Controller 
    { 
     // 
     // GET: /Domain/PhoneNumberTypes/ 
     private IRepository<Paris.Domain.Models.PhoneNumberType> db; 
     public PhoneNumberTypesController(IRepository<Paris.Domain.Models.PhoneNumberType> context) 
     { 
      db=context; 
     } 
     public ViewResult Index() 
     { 

      return View(db.Get().Select(i=>i)); 
     } 
     public ViewResult IndexCreate(Paris.Domain.Models.PhoneNumberType num) 
     { 
      Create(num); 
      return View(); 
     } 
     public ViewResult Edit() 
     { 
      return View(); 
     } 
     [HttpPost] 
     public ViewResult Edit(Paris.Domain.Models.PhoneNumberType num) 
     { 
      try 
      { 
       if (ModelState.IsValid) 
       { 
        db.Update(num); 
        return Index(); 
       } 
       else 
        return View(); 
      } 
      catch 
      { 
       return View(); 
      } 
     } 
     [HttpPost] 
     public ViewResult Delete(int PhoneNumberTypeID) 
     { 
      db.Delete(db.Get().First(i => i.PhoneNumberTypeID == PhoneNumberTypeID)); 

      return Index(); 
     } 
     [HttpPost] 
     public ViewResult Create(Paris.Domain.Models.PhoneNumberType num) 
     { 
      try 
      { 
       if (ModelState.IsValid) 
       { 
        db.Create(num); 
        return View(); 
       } 
       else 
        return View(); 
      } 
      catch 
      { 
       return View(); 
      } 
     } 
     [HttpGet] 
     public ViewResult Create() 
     { 
      return View(); 
     } 
    } 
} 

如果我这样做完全错误的,随意点出我的想法是怎样的缺陷。

感谢

你在做什么逻辑上是正确的。但是,在部分创建的提交按钮上,您的整个页面应该刷新。为什么没有发生?你使用Ajax创建新记录吗?

我想这是你在做什么:

  1. 发帖创建行动。
  2. 记录已创建,然后从数据源中提取新记录集。
  3. 您将其传回您的视图(return View("Index", recordset))。
  4. 索引视图刷新了新的记录集。

如果你正在做这些步骤,那么它应该工作。

+0

我刚刚发布了它的代码它有帮助 – Micah 2011-01-08 15:39:01

在您的Create操作方法中,您只返回创建视图,而不是整个页面。这是因为View()的默认行为是返回与操作方法同名的视图。因此,如果您希望帖子返回整个页面,则需要指定正确的视图名称,或者更好地将重定向返回到Index操作。例如:return RedirectToAction("Index");