2015-09-15 62 views
0

我试图从我的索引页面访问多个操作,而不是为每个操作分别创建视图。但我没有多少运气,而且我几乎陷入困境。对同一视图的ASP.net mvc5 multple动作?

我的BeginForm无法解析操作Create也无法解析控制器CategoriesController

这是我的控制器:

public class CategoriesController : Controller 
{ 
    private readonly ApplicationDbContext _db = new ApplicationDbContext(); 

    public async Task<ActionResult> Index() 
    { 
     return View(await _db.Categories.ToListAsync()); 
    } 

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

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Create([Bind(Include = "Id,Name")] Category category) 
    { 
     if (ModelState.IsValid) 
     { 
      _db.Categories.Add(category); 
      await _db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

     return View(category); 
    } 

    public async Task<ActionResult> Delete(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Category category = await _db.Categories.FindAsync(id); 
     if (category == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(category); 
    } 

    [HttpPost, ActionName("Delete")] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> DeleteConfirmed(int id) 
    { 
     Category category = await _db.Categories.FindAsync(id); 
     _db.Categories.Remove(category); 
     await _db.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      _db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 
} 

这是我的看法

@using MultipleActionsSameView.Controllers 
@model IEnumerable<MultipleActionsSameView.Models.Category> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Name) 
     </td> 
     <td> 
      @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
     </td> 
    </tr> 
} 

</table> 

@using (Html.BeginForm("Create", "CategoriesController", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Category</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 
+0

生成<表单操作HTML表单=“/分类/创建” enctype =“multipart/form-data”method =“post”>? –

+0

@PaulZahra阴性。 –

+1

in beginform控制器的名称必须是没有后缀的类别控制器 – user3401335

回答

1

您是否尝试过在Html.BeginForm下降 “CategoriesController” 的 “控制器” 后缀?而不是 “CategoriesController”

@using (Html.BeginForm("Create", "Categories", FormMethod.Post)) 
{ 
     //your code 
} 

样品这里

1

有多个在一个视图中的提交按钮执行以下操作:

创建一个属性...

using System; 
using System.Reflection; 
using System.Web.Mvc; 

/// <summary> 
/// The MultipleButtonAttribute class is a custom attribute to cater for a view form with multiple submit buttons. 
/// </summary> 
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class MultipleButtonAttribute : ActionNameSelectorAttribute 
{ 
    public string Name { get; set; } 
    public string Argument { get; set; } 

    /// <summary>Determines whether the action name is valid in the specified controller context.</summary> 
    /// <param name="controllerContext">The controller context.</param> 
    /// <param name="actionName">The name of the action.</param> 
    /// <param name="methodInfo">Information about the action method.</param> 
    /// <returns>True if the action name is valid in the specified controller context; otherwise, false.</returns> 
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     var isValidName = false; 
     var keyValue = string.Format("{0}:{1}", this.Name, this.Argument); 
     var value = controllerContext.Controller.ValueProvider.GetValue(keyValue); 

     if (value != null) 
     { 
      controllerContext.Controller.ControllerContext.RouteData.Values[this.Name] = this.Argument; 
      isValidName = true; 
     } 

     return isValidName; 
    } 

然后在视图中我有多个提交按钮,并在像这样的索引操作指向一个形式...

@using (Html.BeginForm("Index", "Categories", FormMethod.Get, new { id = "mainForm" })) 
{ 
    <input type="submit" value="Create" name="action:Create" /> 
    <input type="submit" value="Edit" name="action:Edit" /> 
} 
在我的控制器

然后:

[HttpGet] 
[MultipleButton(Name = "action", Argument = "Create")] 
public ActionResult Create() 

[HttpGet] 
[MultipleButton(Name = "action", Argument = "Edit")] 
public ActionResult Edit() 
+0

是否有任何指导,你知道这是好的,所以我可以阅读更接近主题? –

+0

阅读http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx –

+0

和http:// stackoverflow。 COM /问题/ 442704 /怎么办,你把手海报提交,按钮式-ASP净MVC框架 –