我正在研究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
完成并保存更改后的过滤选项。
有什么想法吗?
答案 0 :(得分:0)
您是否尝试过更改传递当前过滤器以重定向到操作,如下所示? 注意:我假设:
您有一个名为 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);
到目前为止,所有初始测试都导致返回主视图,并且在输入记录进行更新之前已经存在所有排序/过滤条件。