【问题标题】:MVC4 passing same parameters to multiple actions on controllerMVC4 将相同的参数传递给控制器​​上的多个操作
【发布时间】:2014-02-04 13:43:43
【问题描述】:

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

}

但我不喜欢这种方法的地方在于,我在视图和每个控制器方法中都添加了这些值。

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

【问题讨论】:

    标签: asp.net-mvc-4


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

    【讨论】:

      【解决方案2】:

      您是否考虑过使用 TempData 并在其中设置这些参数。最好的部分是您可以跨控制器持久保存 TempData,并且您可能可以在基本控制器类中修改 TempData 值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        • 1970-01-01
        • 2013-09-22
        • 2011-07-25
        相关资源
        最近更新 更多