2016-12-02 5 views
0

私のデータベース内のエントリを編集しようとしていますが、submitをクリックするとGETメソッドが何度も何度も呼び出され続けます。私はブレークポイントを介してこれをテストしましたが、POSTメソッドが実行されているという証拠はありません - 私の製造元バインドとは何か?ボタンは繰り返しGETメソッドを呼び出し、編集時にPOSTしません。

コントローラ

// GET: Model/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Model model = db.Models.Find(id); 
     if (model == null) 
     { 
      return HttpNotFound(); 
     } 

     ViewBag.Manufacturers = GetManufacturerList(model); 

     return View(model); 
    } 

    // POST: Model/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult EditPost(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var modelToUpdate = db.Models.Find(id); 
     if (TryUpdateModel(modelToUpdate, "", 
      new string[] { "ModelName", "ManufacturerID" })) 
     { 
      try 
      { 
       db.SaveChanges(); 

       return RedirectToAction("Index"); 
      } 
      catch (DataException /* dex */) 
      { 
       //Log the error (uncomment dex variable name and add a line here to write a log. 
       ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator."); 
      } 
     } 

     ViewBag.Manufacturers = GetManufacturerList(); 

     return View(modelToUpdate); 
    } 

ビュー:

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

    <div class="form-horizontal"> 
     <h4>Model</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.ModelID) 

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

     <div class="form-group"> 
      @Html.LabelFor(model => model.Manufacturer.ManufacturerName, "Manufacturer", 
       htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-5"> 
       @Html.DropDownList("ManufacturerID", (List<SelectListItem>)ViewBag.Manufacturers, 
        htmlAttributes: new { @class = "form-control" }) 
       @Html.ValidationMessageFor(model => model.Manufacturer.ManufacturerName, "", 
        new { @class = "text-danger" }) 
      </div> 
     </div> 

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

モデル:事前に

public class Model 
{ 
    [Required] 
    [Display(Name = "Manufacturer")] 
    [ForeignKey("Manufacturer")] 
    public int ManufacturerID { get; set; } 

    [Required] 
    public int ModelID { get; set; } 

    [Required] 
    [StringLength(50, ErrorMessage = "Model cannot be longer than 50 characters.")] 
    [RegularExpression(@"^[a-zA-Z0-9.-/() ]+$", ErrorMessage = "Invalid characters used. A-Z or a-z, 0-9, '.', '-', '()' and '/' allowed.")] 
    [Display(Name = "Model")] 
    public string ModelName { get; set; } 

    public virtual Manufacturer Manufacturer { get; set; } 
    public virtual ICollection<Item> Items { get; set; } 
} 

public class Manufacturer 
{ 
    [Required] 
    public int ManufacturerID { get; set; } 

    [Required] 
    [StringLength(50, ErrorMessage = "Manufacturer cannot be longer than 50 characters.")] 
    [RegularExpression(@"^[a-zA-Z0-9.-/() ]+$", ErrorMessage = "Invalid characters used. A-Z or a-z, 0-9, '.', '-', '()' and '/' allowed.")] 
    [Display(Name = "Manufacturer")] 
    public string ManufacturerName { get; set; } 

    public virtual ICollection<Model> Models { get; set; } 
    public virtual ICollection<Item> Items { get; set; } 
} 

感謝。どんな助けでも大歓迎です。

+0

を、あなたは '[HTTPGET]を適用しようとしたことがあり'' Edit'メソッドの上に置いてください。 '' Edit''を '' GetEdit''の名前に変更してみてください。 –

答えて

1

HttpPostメソッドの名前は "EditPost"です。このように単に「編集」する必要はありませんか?ここで

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(Model model) 
{ 

あなたを助けるかもしれないチュートリアルです:それを考え出しhttps://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view

+0

よくやっていますが、質問には答えられません。だから発砲を続けるgetメソッドです。何か案は? –

+0

@Gert Arnold 100%確かではありません。 BeginForm()を呼び出すときにパラメータを持たず、コントローラ内に "Edit"というポストメソッドがないので、ページをレンダリングするgetメソッドがデフォルトになっているからでしょうか? – Pennywise

+0

入力していただきありがとうございますが、これは間違っています。同じパラメータを持つ2つの 'edit'メソッドがあるので、署名の1つを変更してそれを '上書き'する必要があります。 – James

1

- 私は以下のようにACTIONNAME属性を追加するのを忘れ:

[HttpPost, ActionName("Edit")] 
[ValidateAntiForgeryToken] 
public ActionResult EditPost(int? id) 
{...} 
関連する問題