Model Count check in MVC3 view - c#

Here is my view code:
#model IEnumerable<StudentRegistrationPortal.Models.CourseRegisterModel>
#{
ViewBag.Title = "Welcome Student";
}
<h2>Welcome
#Context.User.Identity.Name
</h2>
#Html.ActionLink("[Sign Out]", "SignOut", "Student")
<ul>
<li>#Html.ActionLink("Register Courses", "registerCourses", "Course")</li>
</ul>
<%if (Model.Count == 5) { %>
<table border="1">
<tr>
<th>
RollNumber
</th>
<th>
Course Code
</th>
<th>
Course Name
</th>
<th>Add/Drop</th>
</tr>
<tr>
<td>
#Context.User.Identity.Name
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(0).Course.Code)
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(0).Course.Name)
</td>
<td>
#Html.ActionLink("Drop", "Drop", new { id=-1 })
</td>
</tr>
<tr>
<td>
#Context.User.Identity.Name
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(1).Course.Code)
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(1).Course.Name)
</td>
<td>
#Html.ActionLink("Drop", "Drop", new { id=-1 })
</td>
</tr>
<tr>
<td>
#Context.User.Identity.Name
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(2).Course.Code)
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(2).Course.Name)
</td>
<td>
#Html.ActionLink("Drop", "Drop", new { id=-1 })
</td>
</tr>
<tr>
<td>
#Context.User.Identity.Name
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(3).Course.Code)
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(3).Course.Name)
</td>
<td>
#Html.ActionLink("Drop", "Drop", new { id=-1 })
</td>
</tr>
<tr>
<td>
#Context.User.Identity.Name
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(4).Course.Code)
</td>
<td>
#Html.DisplayFor(modelItem => Model.ElementAt(4).Course.Name)
</td>
<td>
#Html.ActionLink("Drop", "Drop", new { id=-1 })
</td>
</tr>
</table>
<% } %>
I have added IF condition to only draw table if model count is equals to 5 but still if model contains no data then it gives error that:
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
What is wrong with IF condition?
Thanks.

your code will only work if you have exactly 5 CourseRegisterModel. This is your issue.
why don't you just iterate the model(s)
#foreach(StudentRegistrationPortal.Models.CourseRegisterModel modelValue in Model)
{
<tr>
<td>
#Context.User.Identity.Name
</td>
<td>
#Html.DisplayFor(modelItem => modelValue.Course.Code)
</td>
<td>
#Html.DisplayFor(modelItem => modelValue.Course.Name)
</td>
<td>
#Html.ActionLink("Drop", "Drop", new { id=-1 })
</td>
</tr>
}

if you really insist on doing this logic inside the view, then you can use operator precedence and check for the Model containing items. Without further addo, edit you line:
<%if (Model.Count == 5) { %>
to:
// check will only continue if Model.Any() evaluates to true
#if (Model.Any() && Model.Count == 5) { ... }
I would personally do this in my viewModel inside my service or controller class and really flesh out the logic required for this hardcoded Count == 5 existing. You aslo seem to be mixing razon and webforms syntax.

Why are you using <% syntax in if clause, change it to use #
#if (Model.Count == 5)
{
also at the end change <% } %> to following
}

If Model is Null then accessing to the count would be throw an exception. so before that you have to check that if the model is null or not.
#if(Mode != null && Mode.Count == 5)
{
//....

Related

Model.List is null after post in ASP.NET MVC

I know there's other questions about this, but I want a better explanation about it.
I want to show a table with my Model.List and after POST I still need to access that list. Today this is not happening.
This is my cshtml:
#foreach (var student in Model.ListSchedulingDetails)
{
<tr>
<td width="150">
#Html.DisplayFor(modelItem => student.SchedulingDate)
</td>
<td width="250">
#Html.DisplayFor(modelItem => student.TeacherName)
</td>
<td width="250">
#Html.DisplayFor(modelItem => student.StudentName)
</td>
<td width="150">
#Html.DisplayFor(modelItem => student.SchedulingHour)
</td>
<td width="250">
#Html.DisplayFor(modelItem => student.SchedulingObservation)
</td>
</tr>
}
After POST, my Model.ListSchedulingDetails is null. What's happening?
There are two things here:
DisplayFor() is for only displaying. For posting, we need input
elements like HiddenFor(),TextBoxFor()
you would need to index them for posting back in case
of collections, foreach wouldn't help
Your code would need to be like:
#for (int i=0; i< Model.ListSchedulingDetails.Count; i++)
{
<tr>
<td width="150">
#Html.DisplayFor(modelItem => ListSchedulingDetails[i].SchedulingDate)
#Html.HiddenFor(modelItem => ListSchedulingDetails[i].SchedulingDate)
</td>
<td width="250">
#Html.DisplayFor(modelItem => ListSchedulingDetails[i].TeacherName)
#Html.HiddenFor(modelItem => ListSchedulingDetails[i].SchedulingDate)
</td>
<td width="250">
#Html.DisplayFor(modelItem => ListSchedulingDetails[i].StudentName)
#Html.HiddenFor(modelItem => ListSchedulingDetails[i].SchedulingDate)
</td>
<td width="150">
#Html.DisplayFor(modelItem => ListSchedulingDetails[i].SchedulingHour)
#Html.HiddenFor(modelItem => ListSchedulingDetails[i].SchedulingDate)
</td>
<td width="250">
#Html.DisplayFor(modelItem => ListSchedulingDetails[i].SchedulingObservation)
#Html.HiddenFor(modelItem => ListSchedulingDetails[i].SchedulingDate)
</td>
</tr>
}

Display results of Model in For Loop instead of Foreach Asp MVC 5

Ok so I basically have a survey wizard with 4 parts in it, I need to display 5 separate results into each, but a for loop as below, will obviously display all results and will therefore break the wizard, how can I loop through this in a for loop?
Any help will be greatly appreciated, thanks
#foreach (var item in Model)
{
<tr>
<td>
#Html.DisplayFor(modelItem => item.Category.Title)
</td>
<td>
#Html.DisplayFor(modelItem => item.Survey.Title)
</td>
<td>
#Html.DisplayFor(modelItem => item.Title)
</td>
</tr>
}
Assuming your Model is some sort of IENumerable
#{ var list = Model.ToList();
for (int i = 0; i < list.Count; i++)
{
<tr>
<td>
#Html.DisplayFor(modelItem => list[i].Category.Title)
</td>
<td>
#Html.DisplayFor(modelItem => list[i].Survey.Title)
</td>
<td>
#Html.DisplayFor(modelItem => list[i].Title)
</td>
</tr>
}
}
Go it, just used an incrementer, seems to work just fine with the Model
#{
int counter = 0;
foreach (var item in Model)
{
counter++;
if (counter > 1 && counter < 6)
{
<tr>
<td>
#Html.DisplayFor(modelItem => item.Category.Title)
</td>
<td>
#Html.DisplayFor(modelItem => item.Survey.Title)
</td>
<td>
#Html.DisplayFor(modelItem => item.Title)
</td>
</tr>
}
}
}

cshtml view if inside of foreach inside of else

I'm trying to display records in my view. I only want to display records that don't have a null value for the TABLE_NUMBER1 field. I've set this up, but am having a weird issue where it won't recognize the closing tag for the else, only the foreach and if. Specifically, if I add a closing tag for the else, it recognizes it as the closing tag for the entire razer section (aka it's gold).
#if (Model.Count() == 0)
{
<tbody>
<tr>
<td colspan="7">
No Records match search criteria
</td>
</tr>
</tbody>
}
else{
foreach (var item in Model)
{
var hiderows = #Html.DisplayFor(modelItem => item.TABLE_NUMBER1).ToString();
if (hiderows != null)
{
<tbody>
<tr>
<td>
<p class="one">#Html.DisplayFor(modelItem => item.PNTR_MAX)</p>
</td>
<td>
<p class="one">#Html.DisplayFor(modelItem => item.EFFECTIVE_DATE1)</p>
</td>
<td>
<p class="one">#Html.DisplayFor(modelItem => item.BANK_ROUTING_NUMBER)</p>
</td>
<td>
<p class="one">#Html.DisplayFor(modelItem => item.TAX_ID)</p>
</td>
<td>
<p class="one">#Html.DisplayFor(modelItem => item.BANK_NAME)</p>
</td>
<td>
<p class="one">#Html.DisplayFor(modelItem => item.COMPANY_NAME1)</p>
</td>
<td>
#Html.ActionLink("Edit", "..\\Table9\\Edit", new { id = item.EFTID })
#Html.ActionLink("Details", "..\\Table9\\Details", new { id = item.EFTID })
#Html.ActionLink("Delete", "..\\Table9\\Delete", new { id = item.EFTID })
</td>
</tr>
</tbody>
}
}
}
This is wrong:
var hiderows = #Html.DisplayFor(modelItem => item.TABLE_NUMBER1);
change it to :
#Html.DisplayFor(modelItem => item.TABLE_NUMBER1)
if (item.TABLE_NUMBER1!= null)
{

ASP.NET MVC 4 passing values between lists

I have a following problem: I have form, which has some dropdowns, textareas etc. and also I have two tables:
- SelectedItems
- AvailableItems
This two tables are a result of rendering two lists in my Model. What I need to do is when user press add button in a defined item row then I move item from AvailableItems to SelectedItems. My idea was to operate on lists so add to one, remove from another. I have no idea how to update lists of objects which can be found in model
public class Model
{
public List<Item> SelectedItems {get; set;}
public List<Item> AvailableItems {get; set;}
//other properties
}
My Partial View is:
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Description</th>
<th></th>
</tr>
</thead>
#if (Model.SelectedItems != null)
{
foreach (var item in Model.SelectedItems)
{
<tr>
<td>
#Html.DisplayFor(modelItem => item.ID)
</td>
<td>
#Html.DisplayFor(modelItem => item.Name)
</td>
<td>
#Html.DisplayFor(modelItem => item.Description)
</td>
<td>
#Html.ActionLink("Add", "RemoveItem", new { ItemID = item.ID}, new { #class = "btn btn-primary" })
</td>
</tr>
}
}
</table>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Description</th>
<th></th>
</tr>
</thead>
#if (Model.AvailableItems != null)
{
foreach (var item in Model.AvailableItems)
{
<tr>
<td>
#Html.DisplayFor(modelItem => item.ID)
</td>
<td>
#Html.DisplayFor(modelItem => item.Name)
</td>
<td>
#Html.DisplayFor(modelItem => item.Description)
</td>
<td>
#Html.ActionLink("Add", "AddItem", new { ItemID = item.ID}, new { #class = "btn btn-primary" })
</td>
</tr>
}
}
</table>
Problem is that I can't reload whole page. I need to make inserts do db basing on that form so is there any possibility to update model and then start inserts?
Thank you for your help.

Rounding a decimal in a table to 2 decimal places

I have a table in my view with columns of numerical data. In the footer of my table I have a row containing the totals of each column. The totals are adding up correctly, but I want the vales in them to be rounded to 2 decimal places, eg instead of 47.4386, I want it to display 47.44.
Sample code:
<table class="display" id="dailyreporttable">
#foreach (var item in Model)
{
<tr>
<td>
#Html.DisplayFor(modelItem => item.DailyReportDate)
</td>
<td>
#Html.DisplayFor(modelItem => item.Estate)
</td>
<td>
#Html.DisplayFor(modelItem => item.BettingShop)
</td>
<td class="alignRight">
#Html.DisplayFor(modelItem => item.ShopBalance)
</td>
<td class="alignRight">
#Html.DisplayFor(modelItem => item.TotalCashIn)
</td>
}
<tfoot>
<tr>
<td>Total</td>
<td></td>
<td></td>
<td class="alignRight">#Model.Sum(item => item.ShopBalance)</td>
<td class="alignRight">#Model.Sum(item => item.TotalCashIn)</td>
</tr>
</tfoot>
Try this:
<td class="alignRight">#Model.Sum(item => item.ShopBalance).ToString("N2")</td>
Got it in the end, the values were actually nullable decimals so I had to do:
<td class="alignRight">#Model.Sum(item => item.ShopBalance).Value.ToString("N2")</td>
Try:
<td class="alignRight">#Model.Sum(Decimal.Round(item => item.ShopBalance), 2)</td>

Categories