1

編集

ソリューションを共有サイトに掲載しました。そのように、あなたは私が話していることを見ることができるでしょう。ここからダウンロードできます: http://www.easy-share.com/1909069597/TestRenderAction.zip

テストするには、プロジェクトを開始し (作成フォームを空にして)、[作成] ボタンをクリックします。あなたは何が起こるかを見るでしょう。

これは単なるサンプル プロジェクトです。今のところ、オブジェクトをデータベースに永続化する必要はありません。私は自分の例をうまく機能させたいと思っています。

私は次のコントローラーを手に入れました:

public class ProductController : Controller
{
    public ActionResult List()
    {
        IList<Product> products = new List<Product>();

        products.Add(new Product() { Id = 1, Name = "A", Price = 22.3 });
        products.Add(new Product() { Id = 2, Name = "B", Price = 11.4 });
        products.Add(new Product() { Id = 3, Name = "C", Price = 26.5 });
        products.Add(new Product() { Id = 4, Name = "D", Price = 45.0 });
        products.Add(new Product() { Id = 5, Name = "E", Price = 87.79 });

        return View(products);
    }

    public ViewResult Create()
    {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Product product)
    {
        return View(product);
    }
}

次のモデル:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }
}

My Product/List.aspx :

<h2>List</h2>

<table>
    <tr>
        <th></th>
        <th>
            Id
        </th>
        <th>
            Name
        </th>
        <th>
            Price
        </th>
    </tr>

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

    <tr>
        <td>
            <%= Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) %> |
            <%= Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ })%>
        </td>
        <td>
            <%= Html.Encode(item.Id) %>
        </td>
        <td>
            <%= Html.Encode(item.Name) %>
        </td>
        <td>
            <%= Html.Encode(String.Format("{0:F}", item.Price)) %>
        </td>
    </tr>

<% } %>

</table>

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

私の製品/Create.ascx:

<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

<% using (Html.BeginForm("Create", "Product", FormMethod.Post)) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="Id">Id:</label>
            <%= Html.TextBox("Id") %>
            <%= Html.ValidationMessage("Id", "*") %>
        </p>
        <p>
            <label for="Name">Name:</label>
            <%= Html.TextBox("Name") %>
            <%= Html.ValidationMessage("Name", "*") %>
        </p>
        <p>
            <label for="Price">Price:</label>
            <%= Html.TextBox("Price") %>
            <%= Html.ValidationMessage("Price", "*") %>
        </p>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

<div>
    <%=Html.ActionLink("Back to List", "Index") %>
</div>

問題は、作成ボタンを押してエラー (空のフィールドなど) が発生したときに、戻りビューが Create.ascx コントロールのみを返すことです。エラーのある Create.ascx コントロールの Product/List.asxp ページが返されません。それが私が望むことです。

その問題をどのように解決できるか考えていますか?

Asp.Net Mvc 1 を Asp.Net Futures (Html.RenderAction を持つ) と共に使用します。

4

3 に答える 3

0

コントローラーは次のように動作するはずです。

public class ProductController : Controller
{
  IList<Product> products;

  public ProductController( )
  {
    products = new List<Product>();
    products.Add(new Product() { Id = 1, Name = "A", Price = 22.3 });
    products.Add(new Product() { Id = 2, Name = "B", Price = 11.4 });
    products.Add(new Product() { Id = 3, Name = "C", Price = 26.5 });
    products.Add(new Product() { Id = 4, Name = "D", Price = 45.0 });
    products.Add(new Product() { Id = 5, Name = "E", Price = 87.79 });
  }

  public ActionResult List( )
  { 
    return View(products);
  }

  public ActionResult Create()
  {
    return View();
  }

  [AcceptVerbs(HttpVerbs.Post)]
  public ActionResult Create(Product product)
  {
    products.Add(product);
    return View("List", products);      
  }
} 

さらに、RenderAction の代わりに RenderPartial を呼び出す必要があります。そうしないと、POST メソッドが呼び出されます (フォームを送信してポストコマンドを実行したため)。

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

これは機能するはずです。ポストバックごとにリセットされるため、製品リストを保持するだけで済みます。

これがお役に立てば幸いです:)

于 2010-01-22T00:24:27.357 に答える
0
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Product product)
{
  ...
  return View("List");
}

また

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Product product)
{
  ...
   return RedirectToAction("List", "Product");
}
于 2010-01-22T00:05:12.277 に答える
-2

テキスト フィールドの名前は、Product オブジェクトのプロパティと同じですか?

製品オブジェクトは、次のようなプロパティを宣言していますか?

public string Name {get;set;}

オブジェクトにはゲッターとセッターが必要です。

編集

リスト ビューのフィールドを作成アクションへの投稿で使用できるようにしたいですか? はいの場合、BeginForm を PartialView レベルではなく View レベルに配置する必要があります。

begin フォームに含まれるフィールドのみがコントローラーにポストされます。

編集2

あ、今見えた気がします。

あなたのコントローラーでは、最初に確認するために product.IsValid を実行する必要があると思います。

ただし、html ではこれも行う必要があります。

<%= Html.TextBox("Id", Model.Id) %>

テキスト ボックスに値を入力する必要があります。

これがあなたが求めていたものであることを願っています。

于 2010-01-21T23:30:08.970 に答える