次の jQuery 生成タブ リンクを含む MVC4 カミソリ ビュー (index.cshtml) があります。
<div id="tabs">
<ul>
@foreach (var item in Model)
{
<li><a href="/MetaData/Edit?Name=@item.Name">@item.DisplayName</a></li>
}
</ul>
<div id="tabs-1">
</div>
</div>
次のコントローラ メソッドを介して生成されます。
public ActionResult Index()
{
return PartialView("Index", db.MetaDatas.ToList());
}
次に、各タブ リンクに関連するコントローラー メソッドは次のとおりです。
[HttpGet]
public ActionResult Edit(string Name = "")
{
MetaData item = db.MetaDatas.Where(md => md.Name.Equals(Name)).Single();
if (item == null)
{
return PartialView(null);
}
return PartialView(item);
}
次のように、ajax を介して edit.cshtml をタブ div にロードします。
@model Data.MetaData
<div id="_metadata_content">
<div class="message-success">@ViewBag.SuccessMessage</div>
<div class="message-error">@ViewBag.ErrorMessage</div>
@using (Ajax.BeginForm("Edit", "MetaData", new AjaxOptions { UpdateTargetId = "_metadata_content", HttpMethod = "POST" }
))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>MetaData</legend>
<h2>@Model.DisplayName</h2>
@Html.HiddenFor(model => model.Name)
@Html.HiddenFor(model => model.DisplayName)
@Html.HiddenFor(model => model.AllowEdit)
<div class="editor-field">
@Html.TextAreaFor(model => model.Val, new { @cols = 80, @rows = 10 })
@Html.ValidationMessageFor(model => model.Val)
</div>
<p>
@if(Model.AllowEdit)
{
<input type="submit" value="Save"/>
}
</p>
</fieldset>
}
</div>
フォームの保存ボタンは、次のコントローラー メソッドにリンクしています。
[HttpPost]
public ActionResult Edit(MetaData metaData)
{
ViewBag.ErrorMessage = "Error updating value";
ViewBag.SuccessMessage = "";
if (ModelState.IsValid)
{
db.Entry(metaData).State = EntityState.Modified;
db.SaveChanges();
ViewBag.SuccessMessage = "Value updated successfully";
ViewBag.ErrorMessage = "";
}
return PartialView("Edit", metaData);
}
保存は正しく機能し、コントローラーの Edit メソッドを正常に呼び出します。戻り時に、SuccessMessage および ErrorMessage の値が正しく更新されます。
ただし、別のタブが選択されている場合、@ViewBag.SuccessMessage および @ViewBag.ErrorMessage の値は、edit.cshtml には反映されません。値はデータベースに正しく保存されますが。
これは、jQuery タブ リンク /MetaData/Edit?Name=@item.Name の構成に関係しているように感じます。理由は、システムの別の部分に同じ構造のページがあるためですが、/Controller/Action/@Model.Value を使用してリンクを作成しています。何らかの理由で、このような文字列パラメーターを使用してリンクを構成することはできません。単に null として送信されるため、?Name=@item.Name を使用しました。
以前に同様の問題を経験したり、アイデアを得たりした人はいますか?