Заполнение @ Html.DropDownListFor () с помощью пользовательского метода в MVC - PullRequest
1 голос
/ 19 июля 2011

Хорошо, вот моя проблема.Я пытаюсь заполнить @Html.DropDownListFor() своими ролями минус Admin роль.Это прекрасно работает, но показывает все роли:

@Html.DropDownListFor(m => m.RoleName, new SelectList(Roles.GetAllRoles()))

Однако здесь показаны все роли, включая Admin roll.

Итак, я создал еще один класс UserHelper.cs с помощью этого методаэто в основном то же самое, что и Roles.GetAllRoles():

public string[] GetUserRoles()
    {
        string[] userroles = null;
        using (MainVeinDataDataContext conn = new MainVeinDataDataContext())
        {
            userroles = (from r in conn.Roles
                         where r.Rolename != "Admin"
                         select r.Rolename).ToArray();
        }
        return userroles;
    }

Однако, будучи очень новым для MVC, я понятия не имею, как представить этот метод DropDownList в представлении.Так что это не работает, независимо от того, что я пытаюсь:

@Html.DropDownListFor(m => m.RoleName, new SelectList(GetUserRoles()))

Я не уверен, что мне не хватает, и это сводит меня с ума.Надеюсь, кто-то там знает, что мне не хватает.

Ответы [ 3 ]

6 голосов
/ 19 июля 2011

Представление не должно отвечать за получение данных из некоторых источников данных. Он должен отвечать только за манипулирование данными, которые были переданы контроллером в форме модели vie.

То, что вы пытаетесь сделать, это шаблон анти-MVC. Код, который вы поместили в этот метод GetUserRoles, является ответственностью контроллера (или уровня доступа к данным), и в результате он должен быть частью вашей модели представления. Так, например, у вас будет следующая модель представления:

public class MyViewModel
{
    public string RoleName { get; set; }
    public IEnumerable<SelectListItem> UserRoles { get; set; }
}

и тогда у вас будет действие контроллера, которое заполнит эту модель представления:

public ActionResult Foo()
{
    // The GetUserRoles could also be part of a repository
    // that you would invoke here
    var userRoles = GetUserRoles();

    // Now construct the view model that you will pass to the view
    var model = new MyViewModel
    {
        UserRoles = userRoles.Select(x => new SelectListItem
        {
            Value = x,
            Text = x
        })
    };
    return View(model);
}

и теперь по вашему мнению:

@model MyViewModel

@Html.DropDownListFor(
    m => m.RoleName, 
    new SelectList(Model.UserRoles, "Value", "Text")
)
0 голосов
/ 03 августа 2011

У меня есть пример similer, и он работает хорошо В моем случае мне нужно заполнить выбранный список из большого списка таблиц SQL.

[In controller]

    public ActionResult GetDealTypes()
    {
        //Seleted Parameter
        return GetReferenceCodesByType("Deal");
    }


    private ActionResult GetReferenceCodesByType(string p_RefType)
    {
        IList<int> ArticleType = db.ReferenceTypes.Where(a => a.Code == p_RefType).Select(a => a.ID).ToList();

        var query = (from rt in db.ReferenceTypes
                     join rc in db.ReferenceCodeModels on rt.ID equals rc.ReferenceTypeId
                     where rt.Code == p_RefType
                     select new { rc.ID, rc.Description }).ToList();

        query.Insert(0, null);
        //Keeping in ViewBag - Which I ll access in view page
        ViewBag.DealTypes = query;
        return View();
    }

[In View]

@Html.DropDownListFor(g => g.DealTypeId, new SelectList(ViewBag.DealTypes, "Id", "Description"))

//ViewBag.DealTypes work as Data source which has been set in controller
@Html.ValidationMessageFor(model => model.DealTypeId)
0 голосов
/ 19 июля 2011

Если вы не добавили свои пространства имен в web.config, вам может потребоваться полная квалификация метода GetUserRoles() для его правильной регистрации.

...