Как я могу ограничить параметры в раскрывающемся списке только для допустимых параметров? - PullRequest
0 голосов
/ 27 января 2011

позвольте мне объяснить подробнее, у меня есть много людей в моем БД. и у них есть вариант «один ко многим» иметь план действий, на моей странице отображаются все люди, у которых есть планы действий. У меня также есть выпадающий список для фильтрации бросил всех людей, у которых есть планы действий ... это прекрасно работает. выпадающие списки работают нормально, часть, которую я не могу получить, это то, что есть фильтр выпадающего списка с именем людей (чтобы найти все планы действий для этого одного человека), но выпадающий список показывает ВСЕ имена в БД, а не только у которых есть планы действий, есть ли способ ограничить выпадающий список только показом людям, у которых есть планы действий?

извините, если на это уже есть сообщение ... я искал и искал, но не могу найти решение

спасибо

p.s. это может помочь .... и да, я использую MVC это на мой взгляд

<td><%=Html.DropDownList("FORMER_BORROWER", "All")%></td>
        <td><%=Html.DropDownList("CURRENT_OWNERSHIP_ENTITY", "All")%></td>
        <td><%=Html.DropDownList("RESPONSIBLE_PARTY", "All")%></td>
        <td><%=Html.DropDownList("COMPLETED", "All")%></td>
        <td><%=Html.DropDownList("TARGET_DATE", "All")%></td>

это у меня в контроллере

var predicate = PredicateBuilder.False<ACTION_PLAN>();
    predicate = predicate.Or(p => p.COMPLETED != null);

    // former borrower
    if ((Request.Form["FORMER_BORROWER"] != null) && Request.Form["FORMER_BORROWER"] != "")
    {
        FormerBorrower = Request.Form["FORMER_BORROWER"];
        ViewData["FORMER_BORROWER"] = new SelectList((from n in _db.Loans where (n.FORMER_BORROWER_NAME != null) select new { n.FORMER_BORROWER_NAME, FORMER_BORROWER_NAMEID = n.FORMER_BORROWER_NAME }).Distinct().ToList(), "FORMER_BORROWER_NAMEID", "FORMER_BORROWER_NAME", FormerBorrower);
        predicate = predicate.And(p => p.Loan.FORMER_BORROWER_NAME == FormerBorrower);
    }
    else
    {
        FormerBorrower = "";
        ViewData["FORMER_BORROWER"] = new SelectList((from n in _db.Loans where (n.FORMER_BORROWER_NAME != null) select new { n.FORMER_BORROWER_NAME, FORMER_BORROWER_NAMEID = n.FORMER_BORROWER_NAME }).Distinct().ToList(), "FORMER_BORROWER_NAMEID", "FORMER_BORROWER_NAME");
    }

    // current ownership entity
    if ((Request.Form["CURRENT_OWNERSHIP_ENTITY"] != null) && Request.Form["CURRENT_OWNERSHIP_ENTITY"] != "")
    {
        CurrentOwnershipEntity = Request.Form["CURRENT_OWNERSHIP_ENTITY"];
        ViewData["CURRENT_OWNERSHIP_ENTITY"] = new SelectList((from n in _db.DOM_CURRENT_OWNERSHIP_ENTITies select n).ToList(), "CURRENT_OWNERSHIP_ENTITY", "CURRENT_OWNERSHIP_ENTITY", CurrentOwnershipEntity);
        predicate = predicate.And(p => p.Loan.DOM_CURRENT_OWNERSHIP_ENTITY.CURRENT_OWNERSHIP_ENTITY == CurrentOwnershipEntity);
    }
    else
    {
        CurrentOwnershipEntity = null;
        ViewData["CURRENT_OWNERSHIP_ENTITY"] = new SelectList((from n in _db.DOM_CURRENT_OWNERSHIP_ENTITies select n).ToList(), "CURRENT_OWNERSHIP_ENTITY", "CURRENT_OWNERSHIP_ENTITY");
    }

    // responsible party
    if ((Request.Form["RESPONSIBLE_PARTY"] != null) && Request.Form["RESPONSIBLE_PARTY"] != "")
    {
        ResponsibleParty = Request.Form["RESPONSIBLE_PARTY"];
        ViewData["RESPONSIBLE_PARTY"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "RESPONSIBLE_PARTY", "RESPONSIBLE_PARTY", ResponsibleParty);
        predicate = predicate.And(p => p.RESPONSIBLE_PARTY == ResponsibleParty);
    }
    else
    {
        ResponsibleParty = null;
        ViewData["RESPONSIBLE_PARTY"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "RESPONSIBLE_PARTY", "RESPONSIBLE_PARTY");
    }

    // completed
    if ((Request.Form["COMPLETED"] != null) && Request.Form["COMPLETED"] != "")
    {
        Completed = System.Convert.ToBoolean(Request.Form["COMPLETED"]);
        ViewData["COMPLETED"] = new SelectList((from n in _db.ACTION_PLANs where (n.COMPLETED != null) select new { n.COMPLETED}).Distinct().ToList(), "COMPLETED", "COMPLETED", Completed);
        predicate = predicate.And(p => p.COMPLETED == Completed);
    }
    else
    {
        Completed = System.Convert.ToBoolean(null);
        ViewData["COMPLETED"] = new SelectList((from n in _db.ACTION_PLANs where (n.COMPLETED != null) select new { n.COMPLETED }).Distinct().ToList(), "COMPLETED", "COMPLETED");
    }

    // target date
    if ((Request.Form["TARGET_DATE"] != null) && Request.Form["TARGET_DATE"] != "")
    {
        TargetDate = System.Convert.ToDateTime(Request.Form["TARGET_DATE"]).ToString("MM/dd/yyyy");
        ViewData["TARGET_DATE"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE", TargetDate);
        predicate = predicate.And(p => p.TARGET_DATE == Convert.ToDateTime(TargetDate));
    }
    else
    {
        TargetDate = "";
        ViewData["TARGET_DATE"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE");
    }

Ответы [ 2 ]

1 голос
/ 27 января 2011

Это больше вопрос по SQL, в основном вы хотите, чтобы в раскрывающемся списке отображался результат этого запроса:

Псевдокод:

Select Person.* from Person Inner Join ActionPlan on Person.PersonnId = ActionPlan.PersonId

Внутреннее соединение заставляет ваш запрос возвращать только строки из таблицы, в которых есть запись в таблице ActionPlan.

0 голосов
/ 27 января 2011

Быстрое поискать в Html.DropDownList, кажется, указывает на то, что это ASP.Net MVC - это правильно?

Если вы используете MVC, я удивлен, что вы сделали так далеко, что отображали данные базы данных на экране, не имея представления, где вы можете отфильтровать эти данные.Возможно, вы все до сих пор генерировали?

Я не очень много использовал MVC, а просто собрал быстрый и грязный пример в Visual Studio.Вы должны увидеть две папки, одну с именем Views, а другую с именем Controllers.

В папке Views должен быть файл представления, в котором находится предоставленная вами разметка.

В папке Controllers должен быть файл контроллера для вашего представления, который будет классом с содержимым, выглядящим примерно так:

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class YourController : Controller
    {
        public ActionResult YourView()
        {
            ViewData["FORMER_BORROWER"] = new SelectList(db.Borrowers.ToList, "BorrowerID, "Name");               

            return View();
        }
    }
}

Бит кода, который связывает элемент управления DropDownListэто строка: ViewData ["FORMER_BORROWER"] = ...

Теперь в этом SelectList первым параметром является просто IEnumerable (в моем случае доступ к базе данных), поэтому вы можете использовать LINQ для фильтрации этого объекта.

Ниже приведен тривиальный пример, когда IEnumerable, который я предоставляю, создает в коде, но код, который обращается к вашей базе данных, можно использовать аналогичным образом.Не то, как я использую объединение, чтобы дать только необходимые значения.

List<SelectListItem> items = new List<SelectListItem>(); 
            items.Add(new SelectListItem { Text = "Swimming", Value = "1" }); 
            items.Add(new SelectListItem { Text = "Cycling", Value = "2", Selected = true }); 
            items.Add(new SelectListItem { Text = "Running", Value = "3" });         

List<ExerciseType> et = new List<ExerciseType>();
    et.Add(new ExerciseType{Id="1"});
    et.Add(new ExerciseType{Id="2"});

// the line below uses LINQ to filter out the item with text of "Swimming"            
var filteredList = from x in items
                    join y in et on x.Value equals y.Id
                    where x.Text != "Swimming"
                    select x;


ViewData["Testing"] = new SelectList(filteredList, "Value", "Text");

Приведенный выше код теперь будет отображать только один элемент в DDL - элемент Cycling из-за объединения и где.

Взяв код контроллера, вы получите что-то похожее на приведенный ниже код (фокусируясь только на одной половине поля FORMER_BORROWER, если / else)

FormerBorrower = Request.Form["FORMER_BORROWER"];            
ViewData["FORMER_BORROWER"] = new SelectList((
    from n in _db.Loans
    join x in _db.ActionPlans on n.BorrowerId equals x.BorrowerId
    where (n.FORMER_BORROWER_NAME != null) 
    select new { n.FORMER_BORROWER_NAME, FORMER_BORROWER_NAMEID = n.FORMER_BORROWER_NAME }).Distinct().ToList(), 
    "FORMER_BORROWER_NAMEID", 
    "FORMER_BORROWER_NAME", FormerBorrower);

    predicate = predicate.And(p => p.Loan.FORMER_BORROWER_NAME == FormerBorrower);       

Один комментарий к ответу выше - это покабудет работать, я бы лично посмотрел на настройку дизайна, создание какого-то сервиса для вызова контроллера, абстрагирование некоторой логики доступа к данным.В идеале у вас теперь должен быть ObjectContext вверх на уровне контроллера, но вниз на уровне сервиса, что дает более сфокусированный контроллер, который не пытается управлять представлением в то же время, что и доступ к уровню данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...