Как привязать столбец к DropDownList и получить значение Selected в MVC3?

Привет, ребята, у меня есть две таблицы, которые выглядят так

          usertable                                 RoleTable
   -----------------------                     ---------------------------
  UserID|UserName|Pwd|RoleID                        RoleID|RoleName
    1   |Anil    |123|1                               1   |Admin

теперь я показываю пользовательскую таблицу в таблице, где у него есть ссылка AddNew, когда администратор нажимает ссылку AddNew, я показываю ему страницу AddNew, где у него есть несколько ярлыков и текстовых полей для пользователя AddNew,

Теперь то, что я хочу сделать, это на странице AddNew. Я хочу показать все имена ролей в раскрывающемся списке, чтобы администратор мог выбрать, в какой роли должен быть пользователь... и я хочу получить выбранные данные

это мой модельный класс

         public class ResourceModel
{
    public static List<ResourceModel> GetList { get; set; }
    public Int16 EmployeeId { get; set; }
    public string EmployeeName { get; set; }
    public string EmployeeEmailId { get; set;}
    public string GroupName { get; set; }
    public string EmployeePassword { get; set; }

}

это мой контроллер

            [AcceptVerbs(HttpVerbs.Get)]
     public ActionResult AddNew()
    {

        ViewBag.Roles = new SelectList(GetRoles(),"RoleID","RoleName");           
        return View();
    }
    //
    //Geting All Roles In a GetRoles()/
    //
      public static GetRoles()
      {

        SqlConnection conn = new SqlConnection("Data Source=LMIT-0039;Initial Catalog=BugTracker;Integrated Security=True");
        SqlCommand Cmd = new SqlCommand("Select GroupId,EmplopyeeRole from  EmployeeGroup", conn);
        conn.Open();
        SqlDataAdapter da = new SqlDataAdapter(Cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        {
            //roles.Add(new SelectListItem{.Value=i,.Text=i};                   
            var model = new ResourceModel();
            model.RoleId = Convert.ToInt16(ds.Tables[0].Rows[i]["GroupId"]);
            model.RoleName = ds.Tables[0].Rows[i]["EmplopyeeRole"].ToString();
            //roles.Value=Convert.ToString( model.RoleId);
            //roles.Text=model.RoleName;
        }
        conn.Close();
          return ds ;
      }

что я должен вернуть в приведенном выше коде

это моя страница AddNew Aspx

     <div>
    <% using (Html.BeginForm())
  { %>
  <%-- <form action="Create.aspx" method="post"></form>--%>
   <%:Html.ValidationSummary(true)%>
     <fieldset>
   <legend style="color:Orange; font-weight:bolder;">AddNew Project</legend>

    <div class="editor-label" style="color:Orange; font-weight:bolder;">
        <%: Html.LabelFor(model => model.EmployeeName)%>
    </div>
    <div class="editor-field">
       <%:Html.EditorFor(model => model.EmployeeName)%>
      <%: Html.ValidationMessageFor(model => model.EmployeeName)%>
    </div>

    <div class="editor-label" style="color:Orange; font-weight:bolder;">
       <%:Html.LabelFor(model => model.EmployeeEmailId)%>
    </div>
    <div class="editor-field">
       <%:Html.EditorFor(model => model.EmployeeEmailId)%>
       <%:Html.ValidationMessageFor(model => model.EmployeeEmailId)%>
    </div>
    <div class="editor-label" style="color:Orange; font-weight:bolder;">
    <%:Html.LabelFor(model => model.EmployeePassword)%>
    </div>
    <div class="editor-field">
    <%:Html.EditorFor(model => model.EmployeePassword)%>
    <%:Html.ValidationMessageFor(model => model.EmployeePassword)%>
    </div>
      <div class="editor-label" style="color:Orange; font-weight:bolder;">
    <%:Html.LabelFor(model => model.GroupName)%>
    </div>
    <div class="editor-field">
    <%:Html.EditorFor(model => model.GroupName)%>
    <%:Html.ValidationMessageFor(model => model.GroupName)%>
    <p>
        <input type="submit" value="Create" style="color:Orange; font-weight:bolder;"/>
    </p>
    </fieldset>
    <%} %>        
  </div>

Может ли кто-нибудь помочь мне в этом, пожалуйста, в MVC3.... я должен показать имена ролей в раскрывающемся списке. Мне нужно получить значение, выбранное в моем [AcceptVerbs (HttpVerbs.Post)] в контроллере.... любые идеи, пожалуйста

у меня есть процедура хранения для MY [AcceptVerbs (HttpVerbs.Post)], где с выбранным значением раскрывающегося списка я вставлю идентификатор роли имени роли в Db

     Create Procedure InsertEmplyoee
       (
       @EmployeeName varchar(50),
       @EmployeeEmailId varchar(50),
      @EmployeePassword varchar (50),
       @GroupName varchar (50)
          )
       as
       begin
       insert into EmployeeDetails   (EmployeeName,EmployeeEmailId,EmployeePassword,GroupId) values 
    (@EmployeeName,@EmployeeEmailId,@EmployeePassword,(select GroupId from   EmployeeGroup where EmplopyeeRole=@GroupName ))

конец идти


person SoftwareNerd    schedule 18.07.2012    source источник
comment
ребята, может кто-нибудь помочь мне здесь, пожалуйста..........   -  person SoftwareNerd    schedule 19.07.2012


Ответы (2)


Сделайте действие «Получить» следующим образом:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult AddNew()
{
        ViewBag.RoleId = new SelectList(GetRoles(), "RoleID", "RoleName");
        return View();
}

GetRoles должен вернуть список Role

На ваш взгляд:

@Html.DropDownList("RoleId")

Изменить: объяснение

Html.DropDownList будет искать ViewBag (фактически ViewData) список SelectListItem с именем RoleId и создавать с ним раскрывающийся список. Вам не нужно явно указывать список самостоятельно.

Изменить: исправление GetRoles

GetRoles метод должен быть таким:

public static List<Role> GetRoles() {
    SqlConnection conn = new SqlConnection("Data Source=LMIT-0039;Initial Catalog=BugTracker;Integrated Security=True");
    SqlCommand Cmd = new SqlCommand("Select GroupId,EmplopyeeRole from  EmployeeGroup", conn);
    conn.Open();
    SqlDataAdapter da = new SqlDataAdapter(Cmd);
    DataSet ds = new DataSet();
    da.Fill(ds);

    List<Role> allRoles = new List<Role>();
    for(int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) {
        Role role = new Role {
            RoleId = Convert.ToInt16(ds.Tables[0].Rows[i]["GroupId"]),
            RoleName = ds.Tables[0].Rows[i]["EmplopyeeRole"].ToString()
        };

        allRoles.Add(role);
    }
    conn.Close();
    return allRoles;
}

Я всегда работал с EntityFramework. Почему бы вам не использовать этот или какой-либо другой ORM?

person Mohayemin    schedule 18.07.2012
comment
@Mohayemin .. мне нужно объявить, что RoleId, RoleName в моем методе GetRoles () - person SoftwareNerd; 19.07.2012
comment
@anilkumar: Просто верните список всех Role из вашей базы данных в методе GetRoles(). В вашем Role классе есть RoleId и RoleName, не так ли? - person Mohayemin; 19.07.2012
comment
@Mohayemin.. да, они есть в моем классе, но в раскрывающемся списке я пуст - person SoftwareNerd; 19.07.2012
comment
Если вы правильно вернете все Role из GetRoles(), вы не должны получить пустой раскрывающийся список. Поместите указатель отладки на строку return View() и проверьте, что находится в ViewBag.RoleId. дайте мне знать результат. - person Mohayemin; 19.07.2012
comment
@Mohayemin ... можете ли вы проверить мой метод getroles () ... я публикую это в своем вопросе ... я изменил свой код в соответствии с вашими предложениями ... - person SoftwareNerd; 19.07.2012

Подумайте, как вы собираетесь POST вернуть выбранный идентификатор роли на сервер.

Вместо public static List<ResourceModel> GetList { get; set; } используйте public int RoleId {get;set;}. Вы не можете создать @Html.DropDownListFor для List<T>, это не имеет смысла, вы просто отправляете обратно одно значение.

Затем создайте метод в вашей модели, который возвращает IEnumerable из SelectListItem.

public static IEnumerable<SelectListItem> GetRoles()
    {
        var roles = //However you plan to get this data from db
        return roles.Select(o => new SelectListItem
                                     {
                                         Value = o.RoleID,
                                         Text = o.RoleName
                                     });
    } 

Наконец, на ваш взгляд:

@Html.DropDownListFor(x=> x.RoleId, ResourceModel.GetRoles())

person The Muffin Man    schedule 18.07.2012