2017-02-07 117 views
1

MVC如何處理我的代碼中的提交按鈕?我有一個名爲ArticleController的控制器,它應該處理它,但我無法弄清楚如何。MVC如何在控制器中處理按鈕點擊

@{ 
ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

@using (Html.BeginForm()) 
{ 
@Html.AntiForgeryToken() 

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

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

控制器看起來是這樣的:

namespace Decision.Controllers 
{ 
    public class ArticleController : Controller 
    { 
    // GET: Article 
    public ActionResult Index() 
    { 
     return View(); 
    } 
    [HttpGet] 
    public ActionResult Create() 
    { 
     var article = new ArticleController(); 
     var home = new HomeController(); 
     return View(home); 
    } 

    /*[HttpPost] 
    public ActionResult Create(Article article) 
    { 
     entities.Article.AddObject(article); 
     entities.SaveChanges(); 

     return Redirect("/"); 
    }*/ 
    } 
} 

哪種方法處理提交按鈕點擊時?

+1

你的控制器需要用'[HttpPost]'標記的'Index()'方法,它應該包含你在視圖中使用的模型的參數(它將與表單控件的值綁定注意,你的'Create()'GET方法中的代碼沒有意義 - 你不會初始化控制器的實例) –

+0

只需使用@using(Html.BeginForm(「Create」,「Article」,FormMethod.Post) )'和'[HttpPost]'在第二個'Create'方法中,你不需要處理提交按鈕的點擊事件,表單自動調用上下文中給出的控制器動作方法 –

+0

那麼,如果你刪除動詞過濾器並使'文章'一個可選的參數'public ActionResult Create(Article article = null)''那麼你可以使用這個方法獲得'get'和'post'請求。你可以檢查iif文章是否爲null,然後返回View,如果是不 - 繼續BL保存。但這是MVC控制器的一種不尋常的方式。 – Fabjan

回答

1

HttpPost控制器通常會處理它,但是出於某種原因您有註釋掉?你必須標記你的一些信息BeignForm即

@using (Html.BeginForm("Create", "Article", FormMethod.Post, new { @class = "insert any css class here", role = "form" })) 
{ 
+0

它沒有與httpget一起工作。在一篇文章中,我看着他們都使用了,但在我的代碼中,他們都不會與海誓山盟一起走,所以我的httppost會處理按鈕? – Fenrir

+0

嘗試將您的開始表單更新爲編輯後的答案。 –

+0

當我按下按鈕時,應用程序搜索一個名爲Create的網站,它找不到它。我如何在Controller中調用Create函數。 – Fenrir

1

所以,在純HTML,你需要有一個具有交方法的表單中提交按鈕。

<form action = "" method = "post"> 
     <input type="submit" name="x" value="x" /> 
</form> 

BeginForm擴展默認使用post方法。

public static MvcForm BeginForm(
    this HtmlHelper htmlHelper 
) 

要了解如何使用BeginForm擴展,你可以在這裏閱讀更多: How does @Html.BeginForm() works?

你的主要問題看起來是以下幾點:

瞭解如何@using(Html.BeginForm ())有效,您需要知道 它已經在哪個頁面上。使用@using(Html.BeginForm())在2點 不同意見會回來兩個不同的控制器

首先,你可以檢查你的HTML渲染時的形式獲取生成什麼樣的行動:<form action = "" method = "post">

然後您必須知道您有可能將執行的操作/控制器傳遞給BeginForm擴展方法。

例如:

@using (Html.BeginForm("Create", "Article", FormMethod.Post)) 
{ 
    @* *@ 
} 
+0

如何將我輸入的Editor文本作爲參數傳遞給EditorFor字段? – Fenrir

+0

模型綁定。您需要在您希望作爲請求的類中有一個Text屬性(在該HTTPPOST操作中)。 –

+1

這裏有更多關於模型綁定(屬性級別)的內容:http://www.tutorialsteacher.com/mvc/model-binding-in-asp.net-mvc –

1

請看看https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods關於請求方法一個清晰的思路。

當用戶查看頁面時,這是一個GET請求,當用戶提交表單時,通常是POST請求。 HttpGet和HttpPost僅將操作限制爲適用的請求類型。

當您向操作添加[HttpPost]時,MVC清楚地知道使用哪個操作來處​​理POST請求。

0

好像你是在索引視圖。您需要將BeginForm更改爲

@using (Html.BeginForm("Create","Article")) 
{ 
    <<your stuff>> 
} 

並取消註釋發佈方法。