MVC4将相同的参数传递到控制器上的多个操作



我正在创建一个具有显示网格的索引页面的MVC4应用程序。该页面的索引操作具有搜索字符串,排序顺序,帐户ID和供应商ID的参数。

public class MyController
{    
        public ActionResult Index(string searchFilter="", 
                                  string sortOrder="createddate", 
                                  int accountid=0, 
                                  int vendorid=0)
        {
            ...
        }
}

在此主页上,我可以单击网格中的行,这将我带到创建和编辑操作。此外,我在控件上还有其他几个从索引页来调用的操作。

当我按任何这些视图([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} );
              }
        }
}

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

我是在做正确的事情,还是有更好的方法,例如一个使这些东西变得更容易且重复性更低的动作过滤器?

[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被查询字符串参数填充。您可以尝试在会话中存储这些值,并在控制器的每个操作中检索它们。将它们设置一次,并且您完成了在任何地方使用它,如果要更改会话值,就可以通过编写它

您是否考虑过使用tempdata并在其中设置这些参数。最好的部分是您可以跨控制器持续tempdata,也许可以修改基本控制器类中的tempdata值。

相关内容

最新更新