2016-09-15 9 views
0

VSで新しいスキャフォールドアイテムを作成すると、作成ビューと編集アクションのビューが作成されます。ただし、編集ビューはプライマリには@Html.HiddenForキー。編集ビューの作成と編集のアクションに同じ部分を使用してフォームを追加する

例:

@model MyApp.Models.Destaque 

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

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

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

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

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

私は(@using (...含む)BeginFormからすべてのコンテンツを配置し、部分的_formで@Html.HiddenFor(m => m.IdDestaque)を続ける場合、それは私が新しい行を作成することはできません。

_Formパーシャルから@Html.HiddenForを削除すると、編集アクションが機能しません(ModelStateが無効です)。

これを実行してDRYの原則を維持する正しい方法は何ですか?私の編集アクションのModelState検証からPKを削除することは、 "醜い"回避策のようです。

@using (Html.BeginForm("Edit", "Controller", FormMethod.Post, new{attr1 = value1, attr2 = value2})) 
{ 
    @Html.HiddenFor(x => x.Id) 
    ... 
} 

あなたは常にEditActionにポストを作る:あなたはビュー内のモデルのIDをレンダリングすると、次のようにHtml.BeginFormのための別のオーバーロードを使用する必要があります

答えて

0

。あなたのコントローラーでは、編集のために1つのPOSTアクションと、作成とその他の編集の2つのアクションを取得するだけで済みます。

public ActionResult Create() 
{ 
    return View("Edit"); //return the edit view 
} 

public ActionResult Edit(int id) 
{ 
    var entity = manager.FetchById(id); 
    if (entity == null) 
     return HttpNotFound(); 

    //convert your entity to model (optional, but recommended) 
    var model = Mapper.Map<ViewModel>(entity); 

    //return your edit view with your model 
    return View(model); 
} 

[HttpPost] 
public ActionResult Edit(ViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //work with your model 

     return RedirectToAction("Index", "Controller"); 
    } 

    //at this point there is an error, so your must return your view 
    return View(model); 
} 

希望します。

関連する問題