MVC 4和Razor中具有相同参数的操作

时间:2013-04-19 15:44:11

标签: razor asp.net-mvc-4

在我的控制器中,我有两个动作,当更改组合或按下更新按钮时,将调用POST动作。这工作正常。

当我进行创建时,如果创建成功,我会使用return RedirectToAction("Index")

以下是问题的起点。我需要索引中的组合获取create中使用的id的selectedvalue,但我无法在Index操作中传递另一个参数,因为POST Action已经有一个。

如何将参数传递给GET操作并使用Create Action中的selectedvalue更新组合?

我尝试使用“返回视图()”,但它工作但不如预期。

这些是行动:

[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")
}

1 个答案:

答案 0 :(得分:1)

这是TempData派上用场的一种情况,作为在重定向期间存储该信息的一种方式。

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

然后,在您的索引操作中:

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

根据模型的大小和可序列化,您甚至可以将创建的模型对象存储在TempData中,并在Index中检索它。