1

私のコントローラーには 2 つのアクションがあります。コンボが変更されるか、更新ボタンが押されると、POST アクションが呼び出されます。これは正しく機能しています。

作成を行うときreturn RedirectToAction("Index")、作成が成功した場合は を使用します。

ここから問題が始まります。インデックスのコンボが作成で使用される ID の選択値を取得する必要がありますが、POST アクションには既にパラメーターがあるため、インデックス アクションで別のパラメーターを渡すことはできません。

パラメーターを GET アクションに渡し、Create アクションから選択した値でコンボを更新するにはどうすればよいですか?

「Return View()」を使用しようとしましたが、機能しましたが、期待どおりではありませんでした。

アクションは次のとおりです。

[HttpGet]
public ActionResult Index()
{
    ViewBag.ID_CONTRATO = new SelectList(db.CAT_CONTRATOS.Where(t => (t.BAJA == null || t.BAJA == false)), "ID_CONTRATO", "CONTRATO");
    ViewBag.listado = Enumerable.Empty<CAT_CONCEPTOS>();
    return View();
}

[HttpPost]
public ActionResult Index(int Contrato = 0)
{
    if (Contrato == 0)
    {
        ViewBag.ID_CONTRATO = new SelectList(db.CAT_CONTRATOS.Where(t => (t.BAJA == null || t.BAJA == false)), "ID_CONTRATO", "CONTRATO");
        ViewBag.listado = Enumerable.Empty<CAT_CONCEPTOS>();
    }
    else
    {
        ViewBag.ID_CONTRATO = new SelectList(db.CAT_CONTRATOS.Where(t => (t.BAJA == null || t.BAJA == false)), "ID_CONTRATO", "CONTRATO", Contrato);
        var cat_conceptos = db.CAT_CONCEPTOS.Include(c => c.CAT_CONTRATOS).Where(t => ((t.BAJA == null || t.BAJA == false) && (t.ID_CONTRATO == Contrato)));
        ViewBag.listado = cat_conceptos;
    }
    return View();
}

[HttpPost]
public ActionResult Create(CAT_CONCEPTOS cat_conceptos)
{
    if (ModelState.IsValid)
    {
        using (TransactionScope scope = new TransactionScope())
        {
            db.CAT_CONCEPTOS.Add(cat_conceptos);
            db.SaveChanges();
            TransaccionesController t = new TransaccionesController();
            t.Transaccionar("CAT_CONCEPTOS", "Create", cat_conceptos.ID_CONCEPTO, "Se creo un concepto");

            scope.Complete();
            return RedirectToAction("Index");
        }
    }

    ViewBag.ID_CONTRATO = new SelectList(db.CAT_CONTRATOS.Where(t => (t.BAJA == null || t.BAJA == false)), "ID_CONTRATO", "CONTRATO", cat_conceptos.ID_CONTRATO);
    return View(cat_conceptos);
}

そしてビュー:

@model IEnumerable<SAC.Models.CAT_ACTIVOS>
@{
string controlador = ViewContext.RouteData.Values["Controller"].ToString();    
}
@section head{
<link href="@Styles.Url("~/content/DataTables/css")" rel="stylesheet"/>
}
@{
ViewBag.Title = "Activos";
}

<h2>@ViewBag.Title</h2>

<div class="row-fluid">
<div class="span12">
    <div class="row-fluid">
        @using (Html.BeginForm("Index", "Activos"))
        {
            <div class="span9">
                @Html.DropDownList("Contrato", (SelectList)ViewBag.ID_CONTRATO, "Seleccione un Contrato", new { @class = "span12", onchange = @"var form = document.forms[0]; form.submit();" })
            </div>
            <div class="span1">
                <button type="submit" class="btn btn-danger span12"><i class="icon-refresh"></i></button>
            </div>
            <div class="span2">
                @Html.ActionLink("Agregar", "Create", @controlador, new { @class = "btn btn-danger span12" })
            </div>
        }
    </div>
</div>
</div>
@Html.Partial("Shared/_GridActivos", (IEnumerable<SAC.Models.CAT_ACTIVOS>)ViewBag.listado)

@section JavaScript{
@Scripts.Render("~/Scripts/DataTables/js")
}
4

1 に答える 1

1

これは、リダイレクト中にその情報を保存する方法として、TempData が役立つケースの 1 つです。

TempData["MyId"] = t.ID;
return RedirectToAction("Index");

次に、Index アクションで次のようにします。

if (TempData["MyId"] != null) {
    // Retrieve ID and object from the database to load the model.
} else {
    // Your existing code.
}

モデルのサイズとシリアル化可能性によっては、作成されたモデル オブジェクトを TempData に格納し、それを Index で取得できる場合もあります。

于 2013-04-19T15:49:29.583 に答える