MVC4将相同的参数传递给控制器​​上的多个动作

时间:2014-02-04 04:31:16

标签: asp.net-mvc-4

我正在创建一个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} );
              }
        }

}

但是我不喜欢这种方法,因为我正在用我的观点和每个控制器方法来理解这些值。

我做的是正确的,还是有更好的方法,比如动作过滤器可以让这些东西变得更容易,更少重复?

2 个答案:

答案 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难以填充查询字符串参数。您可以尝试将这些值存储在会话中,并在控制器的每个操作中检索它们。设置它们一次并完成它以在任何地方使用它,如果你想改变会话值,你可以只是写它