Query Selected Items using checkbox in MVC - c#

I like to ask if how would it be possible that the selected items in the checkbox will be used in making linq query in MVC.
I have this one in my view where in I displayed all the possible options in which the user will just simply select the types of softwares that will be used to generate reports.
#using (Ajax.BeginForm("Create_Report", "Softwares",
new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "target2"
}))
{
#Html.ValidationSummary(true)
<p>For A Reports: Kindly check softwares to create reports.</p><br />
foreach (var item in Model) {
<input type="checkbox" value="#item.software_name" name="software_type"/>#item.software_name
<br />
}
<input type="submit" value="Create Report"/>
}
After that, I want that the selected software types will be used in the query like for example if the user selects Adobe Pro, Adobe Illustrator, MS Visio, and Acrobat, the query should go like "Select from Software _table where software__type = "Adobe Pro" && software_type ="Adobe Illustrator && "so fort.
Is there any ways to shorten the query using the selected items from the checkbox? Any help is much appreciated.

Assuming your POST method is
[HttpPost]
public ActionResult Create_Report(string[] software_type)
then software_type will contain an array of the selected values so you can use .Contains() to filter the query
var items = db.Software.Where(s => software_type.Contains(s.software_type))
Side note: remove those awful underscores from your properties and follow normal naming conventions (SoftwareType, SoftwareName, etc or simply Type, Name etc since they are already in a class named Software)

You need to define a collection to store you selected items and use model binding to map the selected items to this property.
//store checked Items
public IEnumerable<string> SelectedSoftware { get; set; }
//check box list items
public List<string> SoftwareList = new List<string>();
foreach (var item in Model.SoftwareList )
{
<input type="checkbox" name="SelectedSoftware" value="#item">#item
}
in your controller:
public ActionResult Create_Report(string[] SelectedSoftware)
{
//do action
}

Related

ASP.NET MVC DropDownListFor doesn't set selected data to true in List

I have a view which has a model that is an IEnumerable. I use DropDownListFor Html helper in a foreach loop to output dropdown lists. But it doesn't set the selected item to true. Code as below:
#model IEnumerable<Example>
#foreach (var item in Model) {
#Html.DropDownListFor(modelItem => item.FilePath, (IEnumerable<SelectListItem>)ViewBag.ConfigFiles, string.Empty, null)
}
The above code output a Html select element. But none of the options are selected even though the item.FilePath has the same value as one of the options.
This is an unfortunate limitation of using DropDownListFor() in a loop, and you need to generate a new SelectList in each iteration. However, your use of a foreach loop to generate the form controls will not work. Its creating duplicate name attributes which have no relationship to your model therefore will not bind, and its also generating duplicate id attributes which is invalid html.
Change your model to IList<T> and use a for loop and generate a new SelectList in each iteration using the constructor that sets the selectedValue
#model IList<Example>
....
#for(int i = 0; i < Model.Count; i++)
{
#Html.DropDownListFor(m => m[i].FilePath, new SelectList(ViewBag.ConfigFiles, "Value", "Text", Model[i].FilePath), string.Empty, null)
}
Note that this now generate name attributes which binds to your model
<select name="[0].FilePath">....<select>
<select name="[1].FilePath">....<select>
.... etc
Note that its not necessary to create IEnumerable<SelectListItem> in the controller. Your could instead assign a collection of your objects to ViewBag
ViewBag.ConfigFiles = db.ConfigFiles;
and in the view
new SelectList(ViewBag.ConfigFiles, "ID", "Name") // adjust 2nd and 3rd parameters to suit your property names

Get values with Multiple checkboxes in Razor MVC4

Currently I'm working on MVC4 web application, I need to get values which are selected or not from multiple checkboxes from the web page. Here is my code in View to render checkboxes.
using (Html.BeginForm("Controller", "NameSpace", FormMethod.Post))
{
#foreach (var Leave in Model)
{
<tr class="Row">
<td>
#Html.CheckBox("leaves")
</td>
<td>#Leave.EmployeeId</td>
<td>#Leave.EmployeeName</td>
</tr>
}
<input type="submit" name="btn" value="Approve"/>
<input type="submit" name="btn" value="Reject"/>
}
How can I get those checkBox's values in my controller...?
put a name on the check box(es)and you can pull the value on the controller using request
#Html.CheckBox("leaves", new { name = "leaves" })
then on then controller
string selected = Request.Form["leaves"].ToString();
string[] selectedList = selected.split(',');
foreach(var temp in selectedList){
// do something with the result
}
this will return a comma delimited list (1,5,8) of the id's of all of the selected checkboxes (if there are more than 1).
You better use:
string[] selectedList =Request.Form.GetValues("leaves");
Instead of:
string selected = Request.Form["leaves"].ToString();
string[] selectedList = selected.split(',');
for getting an array instead of one concatenated string which needed to be splitted.
Moreover, in this way you don't have to worry about having commas in your values.

ASP.NET MVC CheckBoxList from model with List Property

Apologies if the title is unclear.
I'm trying to return my model from a form submit in ASP.NET MVC.
My question is nearly the same as this question, only differing in that I don't have a List<Model> but a model like:
public Model
{
string UserName {get; set;}
string Password {get; set;}
List<Roles> UserRoles {get; set;}
}
where I need the UserRoles as checkboxes that the admin can select from when creating a new user. My question is, I'm unsure how to use a '#Html.CheckBoxFor' against a list. I tried this:
#for (var i = 0; i < Model.UserRoles.Count();i++ )
{
#Html.HiddenFor(model => model.UserRoles[i].RoleID)
#Html.CheckBoxFor(model => model.UserRoles[i].Selected)
#Html.LabelFor(model => model.UserRoles[i].Name)
}
which in no way worked - every label on the page is "Name", and my List was empty in the POST. Can anyone offer me any guidance on this?
No need to go away from Razor at all.
This works for me:
for (var i = 0; i < Model.UserRoles.Count(); i++)
{
var role = Model.UserRoles[i];
#Html.HiddenFor(model => model.UserRoles[i].RoleId)
#Html.CheckBoxFor(model => model.UserRoles[i].Selected)
#Html.LabelFor(model=> model.UserRoles[i].Name, role.Name)
}
See below code, this way you don't need to hide the role Id, also when you save the selected roles for the user, you don't need to loop through all roles to see which role is selected.
View
#foreach (Roles info in Model.UserRoles)
{
<span>
<input type="checkbox" class="checkbox" name="selectedRoles" value="#info.RoleName" id="#infoRoleName" />
<label for="#info.RoleName">#info.RoleName</label>
</span>
}
Action
[HttpPost]
public ActionResult CreateUsers(Model model, string[] selectedRoles)
{
//
}
From your code in the view, the post should work fine providing your post action looks like this:
[HttpPost]
public ActionResult Action(Model model)
{
return View(model);
}
i.e. passing your model across as the argument.
Also make sure you have your model reference in the view too:
#model YourNameSpace.Model
Post a list of check boxes to server and get list of checked items
linq left join to check whether checked, generating checkboxes,received checked list
View
List<eDurar.Models.tbl_ISOCetificate> ModList = db.tbl_ISOCetificate.ToList();
var li = (from cert in db.tbl_ISOCetificate join comCert in db.tbl_CompCertificate on cert.Cert_id equals comCert.CompCer_id into jo from b in jo.DefaultIfEmpty()
select new {cert.Cert_id,cert.Cert_Name,chkd = b.CompCer_SerId==null?"":"checked"}).ToList();
foreach (var item in li)
{
#:<div style="width: 30%; display: inline-block; margin: 1em">
#:<input type="checkbox" #item.chkd name="CheckedCertificates" value="#item.Cert_id">
#:<label>#item.Cert_Name</label>
#:</div>
}
Controller
[HttpPost]
public ActionResult ManageSurveyGroup(int[] CheckedCertificates)
{
return View();
}

how to implement Checkboxes in MVC 3?

Hi I am quiet new on MVC 3 with C#. I am using entity framework and database first approach to generate code automatically. But the problem is, I tried to find information about inserting checkboxes in MVC3 using C# code but I could not get helpful website.
I can insert the check box using HTML tags:
<input type="checkbox" name="Science" id="s1" value="Science" />
<input type="checkbox" name="Biology" id="b1" value="Biology" />
<input type="checkbox" name="Chemistry" id="c1" value="Chemistry" />
But how do I insert the check box value inside the database and validate that only one single checkbox is selected?
e.g I have a table named Paper where I have:
Paper_Title - textbox
Paper_Details - textbox
Category - Checkboxes (e.g. Science, biology, chemistry)
Comments - textbox.
Submit-button
Use radio button and then have an enum for Categories(say enumCategories). Have a model Category of type enumCategories and then in the postback set the model based on which radio button is checked.
Hope this gives you an elaborate idea on the approach.
I don't think that checkboxes are what you need here, they're more used for multi-selectable items. Either radio buttons or a dropdown would be better suited. Personally, I'd say a dropdown is better for you as there's already an editor template built for it, example:
Model:
I have added the following to properties
public string Category { get; set; }
public IEnumerable<SelectListItem> Categories { get; set; }
In the load method I have put two sample categories in there:
Categories = new List<SelectListItem>
{
new SelectListItem
{
Selected = false,
Text = "Chemistry",
Value = "Chemistry"
},
new SelectListItem
{
Selected = false,
Text = "Science",
Value = "Science"
}
};
View:
#Html.DropDownListFor(m => Model.Category, Model.Categories)

dropdown in mvc3 edit form

This maybe very simple but I cant seem to sort it out on my own.
I have created a simple db and entity modal that looks like this
I am trying to create an Create form that allows me to add a new Order. I have a total of 3 tables so what I am trying to do is have the form allowing the person to enter Order date and also has a dropdown list that allows me to select a product from the product table
I want to be able to create a Add or Edit view that allow me to insert the OrderDate into the OrderTable and also insert the OrderID and selected ProductID into OrderProduct.
What steps do I need to do here.
I have created an OrderController and ticked the "Add Actions" and than added a Create View which looks like this
#model Test.OrderProduct
#{
ViewBag.Title = "Create2";
}
<h2>Create2</h2>
<script src="#Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="#Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
#using (Html.BeginForm()) {
#Html.ValidationSummary(true)
<fieldset>
<legend>OrderProduct</legend>
<div class="editor-label">
#Html.LabelFor(model => model.OrderID)
</div>
<div class="editor-field">
#Html.EditorFor(model => model.OrderID)
#Html.ValidationMessageFor(model => model.OrderID)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.ProductID)
</div>
<div class="editor-field">
#Html.EditorFor(model => model.ProductID)
#Html.ValidationMessageFor(model => model.ProductID)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
#Html.ActionLink("Back to List", "Index")
</div>
This creates the view that contains a textbox for both OrderID and ProductID however no date.
My controller CreatePost hasnt been changed
[HttpPost]
public ActionResult Create(FormCollection collection)
{
try
{
var data = collection;
// TODO: Add insert logic here
// db.Orders.AddObject(collection);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
My questions are,
1.How do I swap out ProductID textbox to be a dropdown which is populated from Product
2.How do I get the data from FormCollection collection? I thought of just a foreach however I dont know how to get the strongly typed name
Any help for a newbie would be very helpful.
Thank you!
First thing's first, don't bind to the Order entity. Never bind to an EF object, always try and use a ViewModel. Makes life simpler for the View, and that is the goal here.
So, have a ViewModel like this:
public class CreateOrderViewModel
{
public int OrderId { get; set; }
public DateTime OrderDate { get; set; }
public int SelectedProductId { get; set; }
public IEnumerable<SelectListItem> Products { get; set; }
}
That's it right now.
Return that to your View in your [HttpGet] controller action:
[HttpGet]
public ActionResult Create()
{
var model = new CreateOrderViewModel
{
Products = db.Products
.ToList() // this will fire a query, basically SELECT * FROM Products
.Select(x => new SelectListItem
{
Text = x.ProductName,
Value = x.ProductId
});
};
return View(model);
}
Then to render out the list of Products: (basic HTML excluded)
#model WebApplication.Models.CreateOrderViewModel
#Html.DropDownListFor(model => model.SelectedProductId, Model.Products)
The only thing i don't know how to do is bind to the DateTime field. I'm guessing you would need an extension method (HTML Helper) which renders out a Date Picker or something. For this View (creating a new order), just default to DateTime.Now.
Now, onto the [HttpPost] controller action:
[HttpPost]
public ActionResult Create(CreateOrderViewModel model)
{
try
{
// TODO: this manual stitching should be replaced with AutoMapper
var newOrder = new Order
{
OrderDate = DateTime.Now,
OrderProduct = new OrderProduct
{
ProductId = SelectedProductId
}
};
db.Orders.AddObject(newOrder);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Now, i also think your EF model needs work.
To me (in English terms), a Product can have many orders, and an Order can have many Products.
So, it should be a many-to-many. Currently it's a 1-1 with a redundant join table. Did you generate that from a DB? If so, your DB possibly needs work.
You should have a navigational property called Products on the Order entity, which references a collection of Product, made possible by a silent join to the join table in the many-to-many.
This also means you no longer have a DropDownList, but a MultiSelectDropDownList.
Thanks Craig. Your few days (as at time of posting) of MVC have solved my few days of trying to get the selected value back from DropDownListFor.
I had no problem in the Create view in getting the selected value of the DDLF, but the Edit view was a completely different matter - nothing I tried would get the selected value back in the Post. I noticed the selected value was lurking in the AttemptedValue of the ModelState, and so Dr.Google referred me here.
I had this in my view
#Html.DropDownList(model => model.ContentKeyID, Model.ContentKeys, Model.ContentKeyName)
where ContentKeys is a SelectList populated from the DB via a ViewModel, and ContentKeyName is the curently selected name.
The wierd thing is, I have another DDL on the view populated in an identical manner. This one works. Why, I don't know. It is the second DDL on the form, but I can't see that making a difference.
I read somewhere else it might have been that I was using Guids as the Id, but that didn't seem to make a difference - I changed to Int32, but don't think I had to - I think it's enums that disagree with DDLF. Nullables seemd to make no difference either.
Now that I've added the form collection to my Post ActionResult, and get the selected value using
-view
#Html.DropDownList("ContentKey", Model.ContentKeys)
-in controller (Post)
contentKeyId = int.Parse(form.GetValue("ContentKey").AttemptedValue);
all is good, and I can get on with more exciting things. Why is that the simplest things can hold you up for so long?
I have been struggling with this over the last day or so too. I'll share my limited knowledge in the hope that it will help someone else.
Note that I use a singleton with a pre-populated list to keep my example application small (i.e. no EF or DB interaction).
To show the ProductList you will need to have a ViewBag or ViewData item which contains the ProductList.
You can set this up in the Controller with something like
ViewData["ProductList"] = new SelectList(Models.MVCProduct.Instance.ProductList, "Id", "Name", 1);
Then update your View to something like:
<div class="editor-field">#Html.DropDownList("ProductList")</div>
For the Post/Create/Update step you need to look into the FormCollection to get your results. Reading other posts it sounds like there used to be a bug in here, but it's fixed now so ensure you have the latest. For my example I have a DropDownList for Product so I just get the selected Id and then go searching for that Product in my list.
[HttpPost]
public ActionResult Create(FormCollection form )//Models.MVCOrder newOrder)
{
MVC.Models.MVCOrder ord = Models.MVCOrder.Instance.CreateBlankOrder();
//Update order with simple types (e.g. Quantity)
if (TryUpdateModel<MVC.Models.MVCOrder>(ord, form.ToValueProvider()))
{
ord.Product = Models.MVCProduct.Instance.ProductList.Find(p => p.Id == int.Parse(form.GetValue("ProductList").AttemptedValue));
ord.Attribute = Models.MVCAttribute.Instance.AttributeList.Find(a => a.Id == int.Parse(form.GetValue("attributeId").AttemptedValue));
UpdateModel(ord);
return RedirectToAction("Index");
}
else
{
return View(ord);
}
}
I've only been working on MVC3 for the last few days, so any advice on improving the above would be appreciated.

Categories

Resources