Guzzyman
Guzzyman

Reputation: 561

Searching with a dropdown list in asp.net MVC

I'm new to ASP.NET MVC. I want to use selected items from my dropdownlist to search my database table. The dropdownlist was generated from a BOL model which automatically binds to the view.

Below are my code snippet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using BLL;
using BOL;

namespace DentiCareApp.Areas.Admin.Controllers
{
    [AllowAnonymous]
    public class GenerateInvoiceController : Controller
    {
        private TreatmentBs objBs;

        public GenerateInvoiceController()
        {
                objBs = new TreatmentBs();
        }
        // GET: Admin/GenerateInvoice
        public ActionResult Index(string CompanyID)
        {
            DentiCareEntities db = new DentiCareEntities();
            ViewBag.CompanyId = new SelectList(db.Companies, "CompanyId", "CompanyName");

            if (CompanyID == null)
            {
                return View();
            }
            else
            {
                return View(db.Treatments.Where(x => x.Company == CompanyID.Take(50)));
            }
            //return View();
        }

Also below is the interface of view.

enter image description here

Secondly, I also want the search result to appear on the same page. How do I do this? If I create a separate action for this, I will need to create a separate view for it. Can partial view be used? If so how?

Below is the code to the View

    @model BOL.GenerateInvoice
    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    <p></p>
    <p></p>
    <p></p>
    <h2>Quickly Generate Invoice</h2>
    @using (Html.BeginForm("Index", "GenerateInvoice", FormMethod.Get))
    {
        @Html.AntiForgeryToken()
        <div class="">
            <div>
                @Html.DropDownList("MyCompany.CompanyId", (IEnumerable<SelectListItem>)ViewBag.CompanyId, "Select Company", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.MyCompany.CompanyId, "", new { @class = "text-danger" })
                <input type="submit" value="Search" class="btn btn-primary" />
            </div>
        </div>
    }

Upvotes: 3

Views: 26931

Answers (3)

Brad C
Brad C

Reputation: 2982

Try this.

Controller action:

public ActionResult Index(string CompanyID)
{
    DentiCareEntities db = new DentiCareEntities();
    ViewBag.CompanyId = new SelectList(db.Companies, "CompanyId", "CompanyName", CompanyID);    // preselect item in selectlist by CompanyID param

    if (!String.IsNullOrWhiteSpace(CompanyID))
    {
        return View();
    }

    return View(db.Treatments.Where(x => x.CompanyID == CompanyID).Take(50));
}

View code:

@model IEnumerable<Treatment>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Quickly Generate Invoice</h2>

@using (Html.BeginForm("Index", "GenerateInvoice", FormMethod.Get))
{
    @Html.AntiForgeryToken()

    @Html.DropDownList("CompanyId", (SelectList)ViewBag.CompanyId, "Select Company", new { @class = "form-control" })
    <input type="submit" value="Search" class="btn btn-primary" />
}

@if(Model != null && Model.Any())
{
    foreach(var item in Model)
    {
        @Html.DisplayFor(model => item)
    }
}

You can change the DisplayFor() here to show individual properties of the given Treatment, such as @Html.DisplayFor(model => model.TreatmentID) and such

Upvotes: 3

Guzzyman
Guzzyman

Reputation: 561

The Above code worked for me but with little tweaks. Here are few modification I made to your code.

  1. The parameter in the Index Action was changed from string to integer.
  2. The Optional Parameter in the ViewBag.CompanyId was removed.
  3. Lastly, the line if (!String.IsNullOrWhiteSpace(CompanyID)) and changed to if (CompanyID == 0) { return View(treatmentList);}

The result however is great as it worked like a charm! Thanks for your help!

        // GET: Admin/ListTreatment
        public ActionResult Index(string sortOrder, string sortBy, string Page, int CompanyID = 0)
        {
            ViewBag.sortOrder = sortOrder;
            ViewBag.sortBy = sortBy;

            var treatmentList = objBs.GetALL();

            //ViewBag.employeeCompany = employeeCompany.Distinct();
            switch (sortOrder)
            {
                case "Asc":
                    treatmentList = treatmentList.OrderBy(x => x.TreatmentDate).ToList();
                    break;
                case "Desc":
                    treatmentList = treatmentList.OrderByDescending(x => x.TreatmentDate).ToList();
                    break;
                default:
                    break;
            }

            ViewBag.CompanyId = new SelectList(db.Companies, "CompanyId", "CompanyName");

            ViewBag.TotalPages = Math.Ceiling(objBs.GetALL().Where(x=>x.CompanyId > 0).Count()/10.0);
            int page = int.Parse(Page == null ? "1" : Page);
            ViewBag.Page = page;

            treatmentList = treatmentList.Skip((page - 1) * 10).Take(10);

            if (CompanyID == 0)
            {
                return View(treatmentList);
            }

            return View(db.Treatments.Where(x => x.CompanyId == CompanyID).Take(50));
        }

Upvotes: 1

user6483127
user6483127

Reputation: 1

  • First : for entity framework id should be nullable, so it can be accepted as argument, the action parameter should be int? CompanyID

  • Second : the comparison is not correct with (CompanyID == 0)

    It should be (CompanyID == null)

Upvotes: 0

Related Questions