我将我的解决方案放在共享网站上。就像那样,你将能够看到我在说什么。您可以在此处下载: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)一起使用。
答案 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) %>
您需要填写文本框的值。
希望这就是你所追求的。