ASP.NET MVC C# dynamic url depending on page variable - c#

If someone loads say three or four entries, when they search and they select entry two to edit, when they click the open button, how would I make it go to say /entry/2 or if they opened entry three it would say /entry/3 ?
I'm new to ASP.NET MVC so I'm really not sure what I am doing:
#model IEnumerable<Savvy_CRM_MVC.Models.RootObject>
#{
Layout = null;
}
#foreach (var m in Model)
{
}
<table class="mui-table">
<thead>
<tr>
<th>Case ID</th>
<th>Forename</th>
<th>Surname</th>
<th>Postcode</th>
<th></th>
</tr>
</thead>
<tbody>
#foreach (var m in Model)
{
<tr>
<td>#m.Caseid</td>
<td>#m.Forename</td>
<td>#m.Surname</td>
<td>#m.Postcode</td>
<td><button>Open Case</button></td>
</tr>
}
</tbody>
</table>
When clicking the button, I want the url to change and it to load the data of that entry to the page in a format that will be decided later.

Your best bet is to change the button into a hyperlink:
#foreach (var m in Model)
{
<tr>
<td>#m.Caseid</td>
<td>#m.Forename</td>
<td>#m.Surname</td>
<td>#m.Postcode</td>
<td><a href="/entry/"+#m.CaseId>Open Case</a></td>
</tr>
}
This will generate a GET request to the "entry/{id}" route.
Hope this helps

Related

Adding to a List of objects from the View

What I wanted to do was seeming simple but I am having a bit of trouble. I've created the following class:
// SelectedItem.cs
public class SelectedItem
{
public Brand Brand { get; set; }
public string Model { get; set; }
}
In my view page I've created a list of SelectedItem:
// Chart.cshtml
#model Prediction.Models.Chart.ManualSelection
#{
#using Prediction.Models.Chart
List<SelectedItem> selectedItems = new List<SelectedItem>();
}
And I'm trying to add to this list from the html in my view. I've created a table that has its rows populated by a foreach loop.
// Also Chart.cshtml, below the previous code section where I created the list
<table class="table table-borderless table-hover table-striped table-sm mb-0">
<tbody>
#foreach (var item in Model.PhoneInfo)
{
<tr>
<td>
#Html.DisplayFor(modelItem => item.Brand)
</td>
<td>
#Html.DisplayFor(modelItem => item.Model)
</td>
<td>
<button type="button" class="btn btn-sm btn-link">Select</button>
</td>
</tr>
}
</tbody>
</table>
Essentially what I'm trying to do is when the button is clicked, I want that specific item.Brand and item.Model to be added to List<SelectedItem> selectedItems.
Unfortunately this is impossible. Like it was mentioned in the comment, this list exists only in the scope of rendering view on the server, before sending to the client's browser. In order to save your item.Brand and item.Model you need to use JavaScript, that will be executed in browser on client side or you can send this information back to the server and process it there.

foreach (var in item) and exclusion

Small Question,
I am having the following in my c# mvc project code:
div class="card-body">
#if (User.IsInRole("Secretaris"))
{
<table class="table">
<tr>
<th>#Html.DisplayNameFor(model => model.FirstName)</th>
</tr>
#foreach (var item in Model)
{
if (User.IsInRole("Secretaris"))
{
<tr>
<td>#Html.DisplayFor(modelitem => item.FirstName)</td>
</tr>
}
}
</table>
}
</div>
When I run the code everything works fine but when I go into the foreach it still gives all the names and not only the names that have the role "Secretaris". Hope someone can help me in what I am doing wrong.
Thanks in advance.
Roel Knippen
Since your Model has a .Firstname property I assume your model represents a person, likely a user.
#User represents the currently logged in user - NOT the user from your model.
You will need to include role information in your model if you want to work with users/permissions in your model. Something like
if (modelItem.Roles.Contains("Sec...")) { }
To show the table to begin with, you check to see if the User has the Secretaris role. So it either will or will not show, depending on that role.
However, then within the foreach loop you check to see if the user is in that role again, which is redundant because that code won't even run if it's not due to your enclosing if statement.
I'm assuming you want to run some kind of check on the "item" object that is an element of the Model.
div class="card-body">
#if (User.IsInRole("Secretaris"))
{
<table class="table">
<tr>
<th>#Html.DisplayNameFor(model => model.FirstName)</th>
</tr>
#foreach (var item in Model)
{
if (item.role == "Secretaris")
{
<tr>
<td>#Html.DisplayFor(modelitem => item.FirstName)</td>
</tr>
}
}
</table>
}
</div>
Maybe something like this where you check if the item.role is secretaris?

Implement Sorting With ASP.NET Core Razor Pages

I have written the following Code to implement sorting. I want to maintain the sortingData(OrderDirection,SortField) between two requests for Sorting. Somehow I'm not able to achieve that.
//In .cshtml Page
#{
SortingPagingInfo info = (SortingPagingInfo)ViewData["SortingPagingInfo"];
}
<form method="post">
#Html.Hidden("SortField", info.SortField)
#Html.Hidden("SortDirection", info.SortDirection)
#Html.Hidden("PageCount", info.PageCount)
#Html.Hidden("PageSize", info.PageSize)
#Html.Hidden("CurrentPageIndex", info.CurrentPageIndex)
<table class="table">
<thead>
<tr>
<th>
<a asp-page="./Page" asp-route-sortData="#info">
#Html.DisplayNameFor(model => model.Tabl[0].Col1)
</a>
</th>
<th>
<a asp-page="./Page" asp-route-sortData="#info">
#Html.DisplayNameFor(model => model.Tabl[0].Col2)
</a>
</th>
<th></th>
</tr>
</thead>
<tbody>
#foreach (var item in Model.Table)
{
<tr>
<td>
#Html.DisplayFor(modelItem => item.Col1)
</td>
<td>
#Html.DisplayFor(modelItem => item.Col2)
</td>
</tr>
}
</tbody>
</table>
</form>
-----In cshtml.cs Page
The get Request is as below:
public async Task OnGetAsync(SortingPagingInfo sortData)
{
SortingPagingInfo info = new SortingPagingInfo();
if (string.IsNullOrEmpty(sortData.SortDirection))
{
info.SortField = "Col1";
info.SortDirection = "OrderBy";
info.PageSize = 10;
info.PageCount = Convert.ToInt32(Math.Ceiling((double)(_context.Tab.Count()
/ info.PageSize)));
info.CurrentPageIndex = 0;
this.sortPageData = info;
ViewData["SortingPagingInfo"] = info;
}
else
{
info = (SortingPagingInfo)ViewData["SortingPagingInfo"];
}
tab1= await _context.Tabl.OrderByDynamic(info.SortField, info.SortDirection).ToListAsync();
}
I'm trying to pass the object and maintain it in ViewData so that It could be accessed. But everytime, only null value is returned. Is there any better way for implementing Sorting with Razor Pages or If this could be made to work?
You cannot simply dump an object as a route data param on a link. What will actually happen here is that Razor will simply call ToString on your info instance. You have a few options:
Break out each property and pass it individually:
<a asp-page="./Page" asp-route-sortField="#info.SortField" asp-route=sortDirection="#info.SortDirection" asp-route-pageCount="#info.PageCount" asp-route-pageSize="#info.PageSize" asp-route-currentPageIndex="#info.CurrentPageIndex">
Serialize the object and then deserialize it in your action:
<a asp-page="./Page" asp-route-sortData="#JsonConvert.SerializeObject(info)">
Then, your action would need to be changed to accept a string:
public async Task OnGetAsync(string sortData)
And inside the action, you'd then deserialize that string back into an instance of SortingPagingInfo:
var info = JsonCovert.DeserializeObject<SortingPagingInfo>(sortData);
Make your links submit buttons instead (you can still style them as links) and have them actually submit a form with all this data:
<form asp-page-handler="./Page" method="get">
#Html.Hidden("SortField", info.SortField)
#Html.Hidden("SortDirection", info.SortDirection)
#Html.Hidden("PageCount", info.PageCount)
#Html.Hidden("PageSize", info.PageSize)
#Html.Hidden("CurrentPageIndex", info.CurrentPageIndex)
<button type="submit" class="btn btn-link">
#Html.DisplayNameFor(model => model.Tabl[0].Col1)
</button>
</form>
However, you currently have a form that wraps your entire table, and you cannot have forms within forms. As a result, you would need to restructure your HTML to ensure that each of these links was outside of any other forms on the page.

Issue with going through a list in view of mvc c#

I am making an mvc application-c# that uses data from a database and I am having trouble looping through the list in the view that is part of my model.
This is my code in the view:
#foreach (var item in Model.communications)
{
<tr>
int i = 0;
<td>#Model.student.FirstName #Model.student.LastName</td>
<td>#item.Notes</td>
<td>#item.Date</td>
<td>
#Model.employeeName[i]
</td>
</tr>
}
try to replace your code with this
use item variable instead of Model so you can access values
#foreach (var item in Model.communications)
{
<tr>
int i = 0;
<td>#item.student.FirstName #item.student.LastName</td>
<td>#item.Notes</td>
<td>#item.Date</td>
<td>
#item.employeeName[i]
</td>
</tr>
}

C# modifying strings

I'm working on an application in which I retrieve data from a database to be displayed in a table in my cshtml. One of the fields I'm calling is a date field. The data for it in the database is stored in the following format: MMDDYY i.e; 091504. For reasons I need not get into, the data has to be stored in that format in the database. I'm trying to figure out how I can modify its display to show 09/15/04 instead of 091504.
#model IEnumerable<BillingApp.Models.SERV_CHARGE_INT_RATE_NSF_PENALTY>
<table id="Test" class="tablesorter">
<thead>
<tr>
<th>Effective Date</th>
</tr>
</thead>
#if (Model.Count() == 0)
{
<tbody>
<tr>
<td colspan="4">
No Records match search criteria
</td>
</tr>
</tbody>
}
else{
<tbody>
#foreach (var item in Model)
{
<tr>
<td>
#Html.DisplayFor(modelItem => item.EFFECTIVE_DATE)
</td>
</tr>
}
</tbody>
</table>
If you use a DateTime object, you can try using [DisplayFormat] in your model.
Ex :
[DisplayFormat(DataFormatString = "{MM/dd/yy}")]
public DateTime EFFECTIVE_DATE { get; set }
If you are using a string instead of DateTime, you could consider converting the data type by using #ByteBlast's solution :
DateTime.ParseExact(item.EFFECTIVE_DATE, "MMddyy", CultureInfo.CurrentCulture);
There are many ways to handle this.
One would be to have your model class parse the dates coming out of the database into actual DateTime objects and then use those throughout your application (probably the best choice, if you need to do anything else with the dates).
Another would be to slice up the string when displaying it, if all you need to do is display the date. Something along the lines of this:
#foreach (var item in Model)
{
<tr>
<td>
#(item.EFFECTIVE_DATE.Substring(0,2))/#(item.EFFECTIVE_DATE.Substring(2,2))/#(item.EFFECTIVE_DATE.Substring(4,2))
</td>
</tr>
}

Categories

Resources