এমভিসিতে <object> তালিকা থেকে একটি রেজার ড্রপডাউনলিস্ট পপুলেট করা


124

আমার একটি মডেল রয়েছে:

public class DbUserRole
    {
        public int UserRoleId { get; set; }
        public string UserRole { get; set; }
    }

public class DbUserRoles
    {
        public List<DbUserRole> GetRoles()
        {
            BugnetReports RoleDropDown = new BugnetReports();
            List<DbUserRole> Roles = new List<DbUserRole>();
            DataSet table = RoleDropDown.userRoleDropDown();
            foreach (DataRow item in table.Tables[0].Rows)
            {
                DbUserRole ur = new DbUserRole();
                ur.UserRole = Convert.ToString(item["UserRoleName"]);
                ur.UserRoleId = Convert.ToInt32(item["UserRoleID"]);
                Roles.Add(ur);
            }
            return Roles;
        }
    }

এবং এখানে এমন নিয়ামক যা ভিউটি লোড করে:

        //
        // GET: /Admin/AddNewUser

        public ActionResult AddNewUser()
        {
            DbUserRoles Roles = new DbUserRoles();
            return View(Roles.GetRoles());
        }

আমি @foreachনীচে দেখানো হিসাবে একটি লুপ ব্যবহার করে প্রদর্শন করতে আইটেমগুলি পেতে পারেন :

@foreach (var item in Model)
       {
           <tr>
               <td>
                   @item.UserRoleId
               </td>
               <td>
                   @item.UserRole
               </td>
           </tr>
       }

তবে আমি যে মডেলটির মধ্য দিয়ে চলেছি তার সাথে কীভাবে একটি ড্রপডাউনলিস্ট পপুলেট করব, আমি চেষ্টা করেছি

@Html.DropDownListFor(x => x.UserRole)

তবে আমার ভাগ্য নেই

উত্তর:


242

আপনি নিজের ব্যবসায়িক যুক্তিটিকে একটি ভিউমোডেলে আলাদা করতে পারেন, যাতে আপনার দর্শনটিতে ক্লিনারটি পৃথক হয়।

প্রথমে আইডি সঞ্চয় করার জন্য একটি ভিউমডেল তৈরি করুন ব্যবহারকারী আইটেমের তালিকা সহ নির্বাচন করবে যা এতে প্রদর্শিত হবে DropDown

ViewModel:

public class UserRoleViewModel
{
    // Display Attribute will appear in the Html.LabelFor
    [Display(Name = "User Role")]
    public int SelectedUserRoleId { get; set; }
    public IEnumerable<SelectListItem> UserRoles { get; set; }
}

তথ্যসূত্র:

কন্ট্রোলারের অভ্যন্তরে আপনার UserRoleতালিকাটি পাওয়ার জন্য একটি পদ্ধতি তৈরি করুন এবং এটিকে রূপে রূপান্তর করুন যা দর্শনে উপস্থাপিত হবে।

নিয়ন্ত্রক:

private IEnumerable<SelectListItem> GetRoles()
{
    var dbUserRoles = new DbUserRoles();
    var roles = dbUserRoles
                .GetRoles()
                .Select(x =>
                        new SelectListItem
                            {
                                Value = x.UserRoleId.ToString(),
                                Text = x.UserRole
                            });

    return new SelectList(roles, "Value", "Text");
}

public ActionResult AddNewUser()
{
    var model = new UserRoleViewModel
                    {
                        UserRoles = GetRoles()
                    };
    return View(model);
}

তথ্যসূত্র:

এখন যে ভিউ মডেলটি তৈরি করা হয়েছে তার উপস্থাপনা যুক্তিটি সরল করা হয়েছে

দেখুন:

@model UserRoleViewModel

@Html.LabelFor(m => m.SelectedUserRoleId)
@Html.DropDownListFor(m => m.SelectedUserRoleId, Model.UserRoles)

তথ্যসূত্র:

এটি উত্পাদন করবে:

<label for="SelectedUserRoleId">User Role</label>
<select id="SelectedUserRoleId" name="SelectedUserRoleId">
    <option value="1">First Role</option>
    <option value="2">Second Role</option>
    <option value="3">Etc...</option>
</select>

4
আপনি এটি সহায়ক বলে আমি খুশি!
ডাস্টিন কিনেঞ্জ

বলুন এটি ফিল্টার সহ একটি তালিকা (একটি গ্রিড যা ড্রপ ডাউনের মধ্যে কী ফলাফলগুলি ফিল্টার করে তা দেখায়)। আপনি কি এই একই দৃশ্যে গ্রিডের ফলাফল যুক্ত করবেন? ধন্যবাদ
আর্নেস্তো

2
আপনাকে ধন্যবাদ, আমি এই রেজার এক্সটেনশানটির প্রথম সন্ধান পেয়েছি এবং এর মধ্যে অফিসিয়াল এমএস ডক্স পড়াও অন্তর্ভুক্ত।
রবার্ট খ্রিস্ট

2
চমত্কার এবং খুব সহায়ক। এটি ভবিষ্যতের জন্য বুকমার্ক করা হবে! +1
মাইক উপজহান

আপনার নিয়ামকটিতে, var roles = dbUserRoles.GetRoles() ...যখন GetRolesপদ্ধতিটি নিয়ামকটিতে থাকে তখন আপনি কী করবেন , যখন dbUserRolesমডেল শ্রেণির উদাহরণ?
ডিলান জেজেনস্কি

29
  @Html.DropDownList("ddl",Model.Select(item => new SelectListItem
{
    Value = item.RecordID.ToString(),
    Text = item.Name.ToString(),
     Selected = "select" == item.RecordID.ToString()
}))

5
"? সত্য: মিথ্যা" অপ্রয়োজনীয়?
নাথান হার্টলি

আমার মডেলটির একটি নির্বাচন নেই। তুমি জানবে কেন?
এ_আরনল্ড

2
using System.Linq;নির্বাচন এক্সটেনশন পদ্ধতি পেতে।
একোলিস

26

একটি উপায় হতে পারে;

    <select name="listbox" id="listbox">
    @foreach (var item in Model)
           {

                   <option value="@item.UserRoleId">
                      @item.UserRole 
                   </option>                  
           }
    </select>

2
উত্তম উত্তর, আমি যে html উত্পাদন করি তার উপর আমার সম্পূর্ণ নিয়ন্ত্রণ থাকতে চাই
আলেকজান্ডার জি

1
অসাধারণ! এটি সেরা উত্তর হতে হবে। সত্যই এইচটিএমএল নিয়ন্ত্রণ। ধন্যবাদ :)
আন্তোনিও

10

কাছাকাছি কিছু:

@Html.DropDownListFor(m => m.UserRole, 
   new SelectList(Model.Roles, "UserRoleId", "UserRole", Model.Roles.First().UserRoleId), 
   new { /* any html  attributes here */ }) 

ড্রপডাউনলিস্টফোর্ড পপুলেশন করার জন্য আপনার একটি নির্বাচন তালিকা দরকার। আপনার প্রয়োজন কোনও HTML বৈশিষ্ট্যের জন্য, আপনি যুক্ত করতে পারেন:

new { @class = "DropDown", @id = "dropdownUserRole" }

7

এর পরিবর্তে List<UserRole>, আপনি আপনার মডেলটিতে একটি রাখতে দিতে পারেন SelectList<UserRole>SelectedUserRoleIdসংরক্ষণ করার জন্য একটি সম্পত্তি যুক্ত করুন ... ভাল ... নির্বাচিত ইউজারোলের আইডি মান।

নির্বাচন তালিকাটি পূরণ করুন, তারপরে আপনার দেখুন ব্যবহারে:

@Html.DropDownListFor(x => x.SelectedUserRoleId, x.UserRole)

এবং আপনি ভাল করা উচিত।

Http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.108).aspx এও দেখুন ।


2

আপনার কলটি DropDownListForপূরণ করতে আরও কয়েকটি পরামিতি দরকার। নিম্নলিখিত এসও প্রশ্নের মতো আপনার একটি নির্বাচন তালিকা প্রয়োজন:

এমভিসি 3 ড্রপডাউনলিস্টফোর্ড - একটি সাধারণ উদাহরণ?

আপনার কাছে যা আছে তা দিয়ে, আপনি কেবল এটিই বলেছেন যে ডেটা কোথায় সংরক্ষণ করবেন, কোথা থেকে তালিকাটি লোড করা যায় না।


1
   @{
        List<CategoryModel> CategoryList = CategoryModel.GetCategoryList(UserID);
        IEnumerable<SelectListItem> CategorySelectList = CategoryList.Select(x => new SelectListItem() { Text = x.CategoryName.Trim(), Value = x.CategoryID.Trim() });
    }
    <tr>
        <td>
            <B>Assigned Category:</B>
        </td>
        <td>
            @Html.DropDownList("CategoryList", CategorySelectList, "Select a Category (Optional)")
        </td>
    </tr>

বেশ কয়েকটি উত্তর এখানে তবে শেষেরটি সমস্যার সমাধান করতে হবে সেরা আইএমও।
ডেথস্টালকার

0

আমি এটির কাছে যাচ্ছি যেন আপনার কোনও ব্যবহারকারী মডেল থাকে:

Users.cs

public class Users
{
    [Key]
    public int UserId { get; set; }

    [Required]
    public string UserName { get; set; }

    public int RoleId { get; set; }

    [ForeignKey("RoleId")]
    public virtual DbUserRoles DbUserRoles { get; set; }
}

এবং একটি DbUserRoles মডেল যা ডাটাবেসে সেই নামে একটি সারণী উপস্থাপন করে:

DbUserRoles.cs

public partial class DbUserRoles
{
    [Key]
    public int UserRoleId { get; set; }

    [Required]
    [StringLength(30)]
    public string UserRole { get; set; }
}

একবার আপনি এটি পরিষ্কার করে ফেললে আপনার কন্ট্রোলারে কেবল ইউজাররোলের সংগ্রহ তৈরি করতে এবং পূরণ করতে সক্ষম হওয়া উচিত:

var userRoleList = GetUserRolesList();
ViewData["userRoles"] = userRolesList;

এবং এই সহায়ক কার্যাদি রয়েছে:

private static SelectListItem[] _UserRolesList;

/// <summary>
/// Returns a static category list that is cached
/// </summary>
/// <returns></returns>
public SelectListItem[] GetUserRolesList()
{
    if (_UserRolesList == null)
    {
        var userRoles = repository.GetAllUserRoles().Select(a => new SelectListItem()
         {
             Text = a.UserRole,
             Value = a.UserRoleId.ToString()
         }).ToList();
         userRoles.Insert(0, new SelectListItem() { Value = "0", Text = "-- Please select your user role --" });

        _UserRolesList = userRoles.ToArray();
    }

    // Have to create new instances via projection
    // to avoid ModelBinding updates to affect this
    // globally
    return _UserRolesList
        .Select(d => new SelectListItem()
    {
         Value = d.Value,
         Text = d.Text
    })
     .ToArray();
}

Repository.cs

GetAllUserRoles()উপরে ফাংশনটির জন্য আমার সংগ্রহস্থল ফাংশন :

public class Repository
{
    Model1 db = new Model1(); // Entity Framework context

    // User Roles
    public IList<DbUserRoles> GetAllUserRoles()
    {
        return db.DbUserRoles.OrderBy(e => e.UserRoleId).ToList();
    }
}

AddNewUser.cshtml

তারপরে আপনার ভিউতে এটি করুন:

<table>
    <tr>
        <td>
            @Html.EditorFor(model => model.UserName,
                  htmlAttributes: new { @class = "form-control" }
                  )
        </td>
        <td>
            @Html.DropDownListFor(model => model.RoleId,
                  new SelectList( (IEnumerable<SelectListItem>)ViewData["userRoles"], "Value", "Text", model.RoleId),
                  htmlAttributes: new { @class = "form-control" }
                  )
         </td>
     </tr>
 </table>

-1
@model AdventureWork.CRUD.WebApp4.Models.EmployeeViewModel
@{
    ViewBag.Title = "Detalle";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Ingresar Usuario</h2>

@using (Html.BeginForm())
{

    @Html.AntiForgeryToken()
<div class="form-horizontal">


    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.PersonType, labelText: "Tipo de Persona", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Employee.PersonType, new List<SelectListItem>
       {
               new SelectListItem{ Text= "SC", Value = "SC" },
               new SelectListItem{ Text= "VC", Value = "VC" },
                  new SelectListItem{ Text= "IN", Value = "IN" },
               new SelectListItem{ Text= "EM", Value = "EM" },
                new SelectListItem{ Text= "SP", Value = "SP" },

       }, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.Employee.PersonType, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.EmployeeGender, labelText: "Genero", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Employee.EmployeeGender, new List<SelectListItem>
       {
           new SelectListItem{ Text= "Masculino", Value = "M" },
           new SelectListItem{ Text= "Femenino", Value = "F" }
       }, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.Employee.EmployeeGender, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.PersonTitle, labelText: "Titulo", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.PersonTitle, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Employee.PersonTitle, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.PersonFirstName, labelText: "Primer Nombre", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.PersonFirstName, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Employee.PersonFirstName, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.PersonMiddleName, labelText: "Segundo Nombre", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.PersonMiddleName, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Employee.PersonMiddleName, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.PersonLastName, labelText: "Apellido", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.PersonLastName, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Employee.PersonLastName, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.PersonSuffix, labelText: "Sufijo", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.PersonSuffix, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Employee.PersonSuffix, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.DepartmentID, labelText: "Departamento", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Employee.DepartmentID, new SelectList(Model.ListDepartment, "DepartmentID", "DepartmentName"), htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.Employee.DepartmentID, "", new { @class = "text-danger" })
        </div>
    </div>


    <div class="form-group">
        @Html.LabelFor(model => model.Employee.EmployeeMaritalStatus, labelText: "Estado Civil", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Employee.EmployeeMaritalStatus, new List<SelectListItem>
       {
           new SelectListItem{ Text= "Soltero", Value = "S" },
           new SelectListItem{ Text= "Casado", Value = "M" }
       }, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.Employee.EmployeeMaritalStatus, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.ShiftId, labelText: "Turno", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Employee.ShiftId, new SelectList(Model.ListShift, "ShiftId", "ShiftName"), htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.Employee.ShiftId, "", new { @class = "text-danger" })
        </div>
    </div>



    <div class="form-group">
        @Html.LabelFor(model => model.Employee.EmployeeLoginId, labelText: "Login", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.EmployeeLoginId, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Employee.EmployeeLoginId, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.EmployeeNationalIDNumber, labelText: "Identificacion Nacional", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.EmployeeNationalIDNumber, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Employee.EmployeeNationalIDNumber, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.EmployeeJobTitle, labelText: "Cargo", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.EmployeeJobTitle, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Employee.EmployeeJobTitle, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.EmployeeBirthDate, labelText: "Fecha Nacimiento", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.EmployeeBirthDate, new { htmlAttributes = new { @class = "form-control datepicker" } })
            @Html.ValidationMessageFor(model => model.Employee.EmployeeBirthDate, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Employee.EmployeeSalariedFlag, labelText: "Asalariado", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Employee.EmployeeSalariedFlag, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Employee.EmployeeSalariedFlag, "", new { @class = "text-danger" })
        </div>
    </div>



    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Guardar" class="btn btn-default" />
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10" style="color:green">
            @ViewBag.Message
        </div>
        <div class="col-md-offset-2 col-md-10" style="color:red">
            @ViewBag.ErrorMessage
        </div>
    </div>
</div>


}

দয়া করে আপনার উত্তরটি ব্যাখ্যা করতে পারেন? এটি আপনার সমাধান বুঝতে সহজ করে তুলবে।
CodeF0x

আপনি যদি নিজের উত্তর এবং কোডটি ব্যাখ্যা না করেন তবে এটি খুব সহায়ক নয়। দয়া করে কিছু স্পেসিফিকেশন যোগ করার বিষয়ে বিবেচনা করুন
এফ-সিজে

তিনি ম্যানুয়ালি আইটেমগুলি .োকাচ্ছেন। তবে আপনার যদি কয়েকশো বা হাজারো এন্ট্রি থাকে তবে এটি খুব কার্যকর নয়। অন্তর্ভুক্ত করা উচিত ছিল EmployeeViewModelএবং Employeeযদিও সেখানে উপস্থিত বস্তুগুলি এবং তাদের প্রকারগুলি প্রদর্শন করা উচিত।
vapcguy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.