返回MVC中的倒数第二个URL(返回View并应用先前的过滤条件)?

时间:2015-06-08 13:44:12

标签: c# asp.net-mvc razor asp.net-mvc-5 grid.mvc

我正在研究MVC5应用程序。在主屏幕上是一个网格,允许用户查看数据并转移到多个视图,以便在每条记录上执行各种操作。其中之一是[编辑]。

我遇到的问题如下:由于数据量大,可以方便地将数据过滤(比如说到特定位置),然后从那里编辑记录。此网格上的过滤器(来自CodePlex的Grid.MVC)部分通过修改URL(http://homeURL/?grid-filter=Location.DEPT__1__accounting)来执行过滤,例如1为等于,2为Cotains,3为StartsWith,4为EndsWith,然后在接下来的2之后强调是搜索标准。

这个功能很好,但是当从[编辑]返回时,用户当前返回到主索引视图而没有设置过滤条件(强制他们反复进行并在执行类似的编辑之前添加过滤条件)相同标准的记录)。

我的POST-EDIT方法目前设置为包括:

        if (ModelState.IsValid)
        {
            collection.MODIFIED_DATE = DateTime.Now;
            collection.MODIFIED_BY = System.Environment.UserName;

            db.Entry(collection).State = EntityState.Modified;
            await db.SaveChangesAsync();
            return RedirectToAction("Index", "Home");
        }

对于我的尝试,我首先考虑使用更新的集合(return View(collection))返回视图,但这当然只是让我回到EDIT视图,而不是像以前那样过滤掉数据网格的主视图指定。我考虑过在数据库中添加一个字段,比如LAST_FILTERED_URL,但这只是一个过度生长的创可贴。

有没有人知道一个干净的方法呢?

修改

我原本想过在早期做类似于Andrea的建议,但没想过用Redirect中传递的url-filter参数进行显式重定向。以下是GET/POST Edit的当前代码:

    // GET: ENITTY_Collection/Edit/5
    public async Task<ActionResult> Edit(int id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        ENTITY_COLLECTION entity_Collection = await db.ENTITY_COLLECTION.FindAsync(id);
        if (entity_Collection == null)
        {
            return HttpNotFound();
        }

        // Other code for Controls on the View

        return View(entity_Collection);
    }

        // POST: ENTITY_Collection/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Edit([Bind(Include = "Id,One_Id,Two_Id,Three_Id,Four_Id,Five_Id,Six_Id,field7,field8,field9,...field18,created_date,created_by,modified_date,modified_by")] ENTITY_COLLECTION entity_Collection)
        {
            if (ModelState.IsValid)
            {
                entity_Collection.MODIFIED_DATE = DateTime.Now;
                entity_Collection.MODIFIED_BY = System.Environment.UserName;

                db.Entry(entity_Collection).State = EntityState.Modified;
                await db.SaveChangesAsync();
                //return RedirectToAction("Index", "Home");
                return View(entity_Collection);
            }

            // Other code for if Model is Invalid before returning to View.

            return View(entity_Collection);
        }

我喜欢Andrea的建议,但我仍然需要一种好方法来存储用户首次导航到GET-Edit View时所拥有的URL,然后使用该过滤后的URL值将用户返回给之前的位置&amp; POST-Edit完成并保存更改后的过滤选项。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您是否尝试过更改传递当前过滤器以重定向到操作,如下所示? 注意:我假设:

  1. 您正在重定向到同一个控制器
  2. 您有一个名为 currentFilterValue 的控制器参数

    RedirectToAction(“Index”,“Home”,new {grid-filter = currentFilterValue});

答案 1 :(得分:0)

Microsoft的MVC项目的默认LoginController包含一堆使用returnUrl参数的方法。使用这种做法,您可以在打开编辑器时包含一个返回URL,在编辑完成后,将用户返回到前一个屏幕,过滤器保持不变(假设它们在URL中)。

我的视图模型基类有一个存储ReturnURL的属性,然后将其存储为隐藏的if。

@Html.HiddenFor(model => model.ReturnUrl)

我从编辑发布的操作有这个逻辑:

if (viewModel.ReturnUrl.IsNotNullOrEmptyTrimmed())
{
    return RedirectToLocal(viewModel.ReturnUrl, "ActionName", "ControllerName");
}
else
{
    // Default hard coded redirect
}

为了防止一些注射,你需要一个像这样的验证方法(如上所述)来确保URL有效:

protected ActionResult RedirectToLocal(string returnUrl, string defaultAction, string defaultController)
{
    try
    {
        if (returnUrl.IsNullOrEmptyTrimmed())
            return RedirectToAction(defaultAction, defaultController);

        if (Url.IsLocalUrl(returnUrl))
            return Redirect(returnUrl);

        Uri returnUri = new Uri(returnUrl);
        if (Url.IsLocalUrl(returnUri.AbsolutePath))
        {
            return Redirect(returnUrl);
        }
    }
    catch
    {
    }

    return RedirectToAction(defaultAction, defaultController);
}

希望这可以为您提供一些想法,并在正确的轨道上。

答案 2 :(得分:0)

我不确定这是否是解决我之后的最正确方式,但似乎对我有用的是使用Session值。

在我的GET方法中,我存储了网址:

Session["returnURL"] = Request.UrlReferrer.AbsoluteUri;

然后在我的POST中,在保存对记录的更改后,我在Redirect()中使用此值:

var returnURL = (Session["returnURL"] != null) ? Session["returnURL"].ToString() : Url.Action("Index", "Home");
return Redirect(returnURL);

到目前为止,所有初始测试都导致返回主视图,并且在输入记录进行更新之前已经存在所有排序/过滤条件。