2015-09-15 60 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框架 –