Asp.Net Mvc - RenderAction - Создать в виде списка - PullRequest
1 голос
/ 22 января 2010

EDIT

Я разместил свое решение на общем сайте. Таким образом, вы сможете увидеть, о чем я говорю. Вы можете скачать его здесь: 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; }
}

Мой продукт / 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. Он не возвращает страницу Product / List.asxp с моим элементом управления Create.ascx с ошибками. Это то, что я хотел бы сделать.

Есть идеи, как мне решить эту проблему?

Я использую Asp.Net Mvc 1 с Asp.Net Futures (которые имеют действие Html.RenderAction).

Ответы [ 3 ]

0 голосов
/ 22 января 2010
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Product product)
{
  ...
  return View("List");
}

или

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Product product)
{
  ...
   return RedirectToAction("List", "Product");
}
0 голосов
/ 22 января 2010

ваш контроллер должен работать так:

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);      
  }
} 

Кроме того, вам нужно вызвать RenderPartial вместо RenderAction, потому что в противном случае будет вызван ваш метод POST (из-за того, что вы выполнили команду после отправки формы):

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

Это должно работать, вам нужно только сохранить список продуктов, так как он будет сбрасываться при каждой обратной передаче.

Надеюсь, это вам помогло:)

0 голосов
/ 22 января 2010

Являются ли имена ваших текстовых полей такими же, как свойства в вашем объекте Product?

Объявляет ли ваш объект продукта свои свойства следующим образом;

public string Name {get;set;}

У вас должны быть геттеры и сеттеры на ваших объектах.

EDIT

Подождите, вы хотите, чтобы поля из вашего списка были доступны в сообщении для вашего действия по созданию? Если да, то вам нужно разместить BeginForm на уровне просмотра, а не на уровне PartialView.

Только поля, содержащиеся в начальной форме, будут публиковаться на вашем контроллере.

РЕДАКТИРОВАТЬ 2

Ах, я думаю, что вижу это сейчас.

В вашем контроллере я думаю, что вы должны сделать продукт. Правильно проверить сначала.

Но в вашем html вы тоже должны это делать;

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

Вам необходимо ввести значение для текстового поля.

Надеюсь, это то, что вы были после.

...