2011-01-08 21 views
0

インデックスビューグリッドがあります。これは、ユーザーがすべてのアイテムを表示しているときと同じページに新しいアイテムを作成できるように、その下に作成部分ビューを配置したいというものです。ただし、部分作成ビューを送信すると、主索引ページに何も起こりません。新しい項目で更新されることはありません(ただし、更新後にその項目が更新されます)。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(); 
     } 
    } 
} 

私は、これは完全に間違ってやっている場合は、私の考えは欠陥があるかを指摘して自由に感じます。

ありがとうございました

答えて

0

論理的にはあなたがしていることは正しいです。ただし、部分作成の送信ボタンでは、ページ全体がリフレッシュされます。なぜそれは起こっていないのですか?新しいレコードを作成するためにAjaxを使用していますか?

  1. 転記アクションを作成するには:

    は、私は、これはあなたがやっていることであると思います。

  2. レコードが作成され、新しいレコードセットがデータソースからフェッチされます。
  3. ビューに戻します(return View("Index", recordset))。
  4. インデックスビューは新しいレコードセットでリフレッシュされます。

これらの手順を実行している場合は、動作するはずです。

+0

私はちょうどそれを助けるコードを投稿しました – Micah

+0

コードを見ました。レコードを作成した後は、単に「作成」ビューを返すだけです(View()を戻す)。この代わりに、#3で提案したやり方やClicktricityの示唆どおりにあなたの "Index"ビューに戻るべきです。主な点は、インデックスビューのリロードをトリガする必要があることです。それが起こると、あなたはあなたの望む機能を得るでしょう。 – Pradeep

1

Createアクションメソッドでは、ページ全体ではなく、作成ビューだけが返されます。これは、デフォルトの動作がView()の場合、アクションメソッドと同じ名前のビューを返すためです。したがって、Postがページ全体を返すようにするには、正しいビュー名を指定するか、Indexアクションにリダイレクトする方がよいでしょう。例:return RedirectToAction("Index");

関連する問題