Asp.Net Mvc - RenderAction - 在列表视图中创建

时间:2010-01-21 23:24:54

标签: asp.net-mvc renderaction

修改

我将我的解决方案放在共享网站上。就像那样,你将能够看到我在说什么。您可以在此处下载:http://www.easy-share.com/1909069597/TestRenderAction.zip

要测试它,请启动项目(让create form为空)并单击Create按钮。你会看到会发生什么。

这只是一个示例项目。我现在不关心将我的对象持久化到数据库。我想让我的榜样有效。

我有以下控制器:

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控件。它不会返回带有错误的Create.ascx控件中的Product / List.asxp页面。这就是我想要的。

知道如何解决这个问题吗?

我将Asp.Net Mvc 1与Asp.Net Futures(具有Html.RenderAction)一起使用。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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);      
  }
} 

此外,您需要调用RenderPartial而不是RenderAction,否则将调用您的POST方法(因为您通过提交表单执行了后命令):

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

这应该可行,您只需要保留产品列表,因为它会在每次回发时重置。

我希望这有助于你:)

答案 2 :(得分:-2)

文本字段的名称是否与Product对象中的属性相同?

您的产品对象是否声明了这样的属性;

public string Name {get;set;}

你的对象上必须有getter和setter。

修改

等等,您是否希望列表视图中的字段在您的创建操作的帖子中可用?如果是,那么您需要将BeginForm放在View级别而不是PartialView级别。

只有开始表单中包含的字段才会发布到您的控制器。

编辑2

啊,我想我现在就看到了。

在你的控制器中,我认为你应该做一个产品.IsValid首先检查。

但是在你的HTML中你也应该这样做;

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

您需要填写文本框的值。

希望这就是你所追求的。