我正在创建一个MVC4应用程序,它有一个显示网格的索引页面。页面的索引操作包含用于控制显示内容的搜索字符串,排序顺序,帐户ID和供应商ID的参数。
public class MyController
{
public ActionResult Index(string searchFilter="",
string sortOrder="createddate",
int accountid=0,
int vendorid=0)
{
...
}
}
在这个主页面中,我可以点击网格中的行,这些行带我进入创建和编辑操作。另外,我在控件上有几个从索引页面调用的其他操作。
当我在任何这些视图上按Save或Cancel时([HttpPost]操作,像往常一样重定向到索引操作。但这些视图没有搜索字符串,排序顺序,帐户ID和供应商ID这样索引视图就可以“恢复”显示的内容。
所以我一直在将这些参数添加到其他动作方法中,并在方法的视图模型中创建一个具有所需属性的对象。
public class PageFeatures
{
public string SearchFilter {get; set;}
public string SortOrder {get; set;}
public int AccountId {get; set;}
public int VendorId {get; set;}
}
public class CreateViewModel
{
public PageFeatures Features { get; set; }
}
public class EditViewModel
{
public EditViewModel(int id)
{
Id=id;
}
public int Id {get; set;}
public PageFeatures Features { get; set; }
}
public class MyController
{
public ActionResult Index(string searchFilter="",
string sortOrder="createddate",
int accountid=0,
int vendorid=0)
{
...
}
public ActionResult Create(string searchFilter="",
string sortOrder="createddate",
int accountid=0,
int vendorid=0)
{
var model = new CreateViewModel();
model.Features = new PageFeatures
{
SearchFilter = searchFilter,
SortOrder = sortOrder,
AccountId = accountid,
VendorId = vendorid
}
return View(model);
}
[HttpPost]
public ActionResult Create(CreateViewModel model)
{
if(ModelState.IsValid)
{
....
return RedirectToAction("Index", new {searchFilter=model.Features.SearchFilter,
sortOrder = model.Features.SortOrder,
accounted = model.Features.AccountId,
vendorid = model.Features.VendorId} );
}
}
public ActionResult Edit( int id=0,
string searchFilter="",
string sortOrder="createddate",
int accountid=0,
int vendorid=0)
{
var model = new EditViewModel(id);
model.Features = new PageFeatures
{
SearchFilter = searchFilter,
SortOrder = sortOrder,
AccountId = accountid,
VendorId = vendorid
}
return View(model);
}
[HttpPost]
public ActionResult Edit(EditViewModel model)
{
if(ModelState.IsValid)
{
....
return RedirectToAction("Index", new {searchFilter=model.Features.SearchFilter,
sortOrder = model.Features.SortOrder,
accounted = model.Features.AccountId,
vendorid = model.Features.VendorId} );
}
}
}
但是我不喜欢这种方法,因为我正在用我的观点和每个控制器方法来理解这些值。
我做的是正确的,还是有更好的方法,比如动作过滤器可以让这些东西变得更容易,更少重复?
答案 0 :(得分:1)
您是否考虑过使用TempData并在那里设置这些参数。最好的部分是您可以跨控制器持久化TempData,也可以修改基本控制器类中的TempData值。
答案 1 :(得分:1)
[HttpPost]
public ActionResult Edit(EditViewModel model)
{
if(ModelState.IsValid)
{
....
return RedirectToAction("Index", new {searchFilter=model.Features.SearchFilter,
sortOrder = model.Features.SortOrder,
accounted = model.Features.AccountId,
vendorid = model.Features.VendorId} );
}
}
您正在使用正确的方法。
如果您不希望您的URL难以填充查询字符串参数。您可以尝试将这些值存储在会话中,并在控制器的每个操作中检索它们。设置它们一次并完成它以在任何地方使用它,如果你想改变会话值,你可以只是写它