1

次の 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 を使用しました。

以前に同様の問題を経験したり、アイデアを得たりした人はいますか?

4

0 に答える 0