1
\$\begingroup\$

My Model

public class AccountListFilterModel
{
 public int page { get; set; }
 public int pagesize { get; set; }
 public string sortOrder { get; set; }
 public string packageTypeFilter { get; set; }
 public string usernameFilter { get; set; }
 public string accountStatusFilter { get; set; }
 public string nameSurnameFilter { get; set; }
 public DateTime startDate { get; set; }
 public DateTime endDate { get; set; }
 public string dateFilter { get; set; }
 public int screenCountFilter { get; set; }
}

My Controller

 public ViewResult Index(AccountListFilterModel accountListFilter){}

My View

@{
var currentPageNumber = Request["page"];
var currentPageSize = Request["pagesize"];
var currentSortOrder = Request["sortOrder"];
var currentUsernameFilter = Request["usernameFilter"];
var currentAccountStatusFilter = Request["accountStatusFilter"];
var currentPackageTypeFilter = Request["packageTypeFilter"];
var currentnameSurnameFilter = Request["nameSurnameFilter"];
var currentDateFilter = Request["dateFilter"];
var currentScreenCountFilter = Request["screenCountFilter"];
var currentScreenCountSortFilter = Request["screenCountSortFilter"];}

and

 <th class="">Account Name
 <a style="@(currentSortOrder == "UserName desc" ? "" : "display:none;")" href="@Url.Action("Index", "Account", new { pagesize = currentPageSize, sortOrder = "UserName asc", usernameFilter = @currentUsernameFilter, accountStatusFilter = @currentAccountStatusFilter, packageTypeFilter = @currentPackageTypeFilter, dateFilter = @currentDateFilter, screenCountSortFilter = @currentScreenCountSortFilter, screenCountFilter = @currentScreenCountFilter })">
 <i class="icon-sort-up"></i></a>
 <a style="@(currentSortOrder == "UserName asc" ? "" : "display:none;")" href="@Url.Action("Index", "Account", new { pagesize = currentPageSize, sortOrder = "UserName desc", usernameFilter = @currentUsernameFilter, accountStatusFilter = @currentAccountStatusFilter, packageTypeFilter = @currentPackageTypeFilter, dateFilter = @currentDateFilter, screenCountSortFilter = @currentScreenCountSortFilter, screenCountFilter = @currentScreenCountFilter,approvedFilter=@currentApprovedFilter })">
 <i class="icon-sort-down"></i></a>
 <a style="@(string.IsNullOrEmpty(currentSortOrder) || !currentSortOrder.StartsWith("UserName") ? "" : "display:none;")" href="@Url.Action("Index", "Account", new { pagesize = currentPageSize, sortOrder = "UserName asc", usernameFilter = @currentUsernameFilter, accountStatusFilter = @currentAccountStatusFilter, packageTypeFilter = @currentPackageTypeFilter,dateFilter = @currentDateFilter, screenCountSortFilter = @currentScreenCountSortFilter, screenCountFilter = @currentScreenCountFilter })">
 <i class="icon-sort"></i></a>
 </th>

How can I shorten my code at View ?

ferada
11.4k25 silver badges65 bronze badges
asked Dec 10, 2014 at 9:30
\$\endgroup\$
1
  • 2
    \$\begingroup\$ Seems like you have a lot of logic in your markup, using MVC you're supposed to split these (logic <-> view). Calculate the desired outcome in the controller and pass those values to the view. \$\endgroup\$ Commented Dec 10, 2014 at 10:06

1 Answer 1

2
\$\begingroup\$

You should pass your AccountListFilterModel to the view, either via model (which is the best solution as it's less error-prone) or using ViewBag \ ViewData (which is an anti-pattern actually, but fits the quick-fix niche). Using the latter approach:

In your controller:

public ViewResult Index(AccountListFilterModel accountListFilter)
{
 ViewBag.Filter = accountListFilter;
}

In your view (you can delete the code at the top of the view, that uses Request to get parameters.

<a style="@(ViewBag.Filter.currentSortOrder == "UserName desc" ? "" : "display:none;")" ... />

It's a general rule of thumb that your view should not contain any logic at all, your controller should supply all the data that the view needs.

answered Dec 10, 2014 at 11:26
\$\endgroup\$
6
  • \$\begingroup\$ Thanks. But What about @Url.Action("Index", "Account", new { pagesize = currentPageSize, sortOrder = "UserName asc", usernameFilter = @currentUsernameFilter...}. This is the main problem. I change the value and send model. How is be my Url.Action? \$\endgroup\$ Commented Dec 10, 2014 at 11:54
  • \$\begingroup\$ If you change the values, then you have some sort of a form or what? \$\endgroup\$ Commented Dec 10, 2014 at 11:55
  • \$\begingroup\$ I mean my code must be according to your answer: @Url.Action("Index","Account",new{ViewBag.Filter}). But at this action i change the one value of ViewBag.Filter . Namely, @Url.Action("Index","Account",new{ViewBag.Filter.sortOder="Username asc"}). But at this code i am sending a one parameter. I wanna send amended ViewBag.Filter Model. \$\endgroup\$ Commented Dec 10, 2014 at 12:02
  • \$\begingroup\$ You can just do @Url.Action("Index", "Account", new { accountListFilter = ViewBag.Filter}. If you want to change the value, jsut do ViewBag.Filter.yourvalue = "something" \$\endgroup\$ Commented Dec 10, 2014 at 12:18
  • \$\begingroup\$ Using ViewBag is really an anti pattern. You should always use strongly typed view models. \$\endgroup\$ Commented Dec 12, 2014 at 18:41

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.