2011-09-13 25 views
7

Esto funciona para mí, pero ¿cómo hago lo mismo usando html.dropdownlist?html.dropdownlist MVC3 confusion

Observe que el valor pasado no es el valor que se muestra al usuario.

@model IEnumerable<MVR.Models.ViewIndividual> 

<h2>Level1</h2>  
<select> 
     @foreach (var item in Model) { 
     <option value="@item.Case_Number">@item.Patient_Lastname , 
              @item.Patient_Firstname 
     </option> 
} 
</select> 
+0

Ver este ejemplo http://stackoverflow.com/questions/7143811/ get-id-and-type-from-html-dropdownlist-to-controller/7143991 # 7143991 –

+0

Y otro artículo que tal vez quiera consultar ht tp: //www.c-sharpcorner.com/UploadFile/b19d5a/7474/ –

Respuesta

13

Como siempre en una aplicación ASP.NET MVC que empezar por definir una vista de modelo:

public class MyViewModel 
{ 
    public string SelectedIndividual { get; set; } 
    public SelectList Individuals { get; set; } 
} 

continuación, se escribe una acción del controlador que puebla este punto de vista el modelo de alguna fuente de datos o algo:

public ActionResult Index() 
{ 
    // TODO : fetch those from your repository 
    var values = new[] 
    { 
     new { Value = "1", Text = "item 1" }, 
     new { Value = "2", Text = "item 2" }, 
     new { Value = "3", Text = "item 3" }, 
    }; 

    var model = new MyViewModel 
    { 
     Individuals = new SelectList(values, "Value", "Text") 
    }; 
    return View(model); 
} 

y, finalmente, se tiene una vista fuertemente tipado usando ayudantes inflexible:

@model MyViewModel 
@Html.DropDownListFor(
    x => x.SelectedIndividual, 
    Model.Individuals 
) 

Dicho esto, porque veo que no está utilizando ningún modelos de vista de su aplicación, siempre se puede intentar lo siguiente fealdad (no se recomienda, hacer esto a su propio riesgo):

@model IEnumerable<MVR.Models.ViewIndividual> 

<h2>Level1</h2> 
@Html.DropDownList(
    "SelectedIndividual", 
    new SelectList(
     Model.Select(
      x => new { 
       Value = x.Case_Number, 
       Text = string.Format(
        "{0}, {1}", 
        x.Patient_Lastname, 
        x.Patient_Firstname 
       ) 
      } 
     ), 
     "Value", 
     "Text" 
    ) 
) 

De Por supuesto, esa pornografía no es algo que recomendaría escribir alguna vez en una vista y no recomendaría ni siquiera a mis peores enemigos.

Conclusión: en una aplicación ASP.NET MVC, siempre debe utilizar los modelos de vista y las vistas fuertemente tipadas con ayudantes fuertemente tipados (consulte la primera parte de mi respuesta).

+0

No importa http://geekswithblogs.net/dotNETvinz/archive/2011/06/03/asp.net-mvc-3-creating-a -simple-sign-up-form.aspx después de mirar este sitio, sé lo que quieres decir. – hidden

0

Aquí está el ejemplo completo

public class PageModel 
    { 
     [Display(Name = "Page ID")] 
     public Guid ID { get; set; } 
     [Display(Name = "Page Type ID")] 
     public Guid PageTypeID { get; set; } 
     [Display(Name = "Title")] 
     public string Title { get; set; } 
     [Display(Name = "Page Type Name")] 
     public string PageTypeName { get; set; } 
     [Display(Name = "Html Content")] 
     public string HtmlContent { get; set; } 
     public SelectList PageTypeList { get; set; } 
    } 

el código C#

public ActionResult Edit(Guid id) 
{ 
    var model = db.Pages.Where(p => p.ID == id).FirstOrDefault(); 


    var typeList = new SelectList(db.PageTypes.OrderBy(s => s.Name).ToList(), "ID", "Name"); 
    var viewModel = new PageModel { PageTypeList = typeList }; 
    viewModel.HtmlContent = model.HtmlContent; 
    viewModel.ID = model.ID; 
    viewModel.PageTypeID = Guid.Parse(model.PageTypeID.ToString()); 
    viewModel.Title = model.Title; 


    return View(viewModel); 
} 

[HttpPost] 
[ValidateInput(false)] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(PageModel page) 
{ 
    if (ModelState.IsValid) 
    { 
     var model = db.Pages.Where(p => p.ID == page.ID).FirstOrDefault(); 
     model.Title = page.Title; 
     model.HtmlContent = page.HtmlContent; 
     model.PageTypeID = page.PageTypeID; 

     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(page); 
} 

y por último html

@model competestreet.com.Models.PageModel 
@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_LayoutCMS.cshtml"; 
} 
<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#HtmlContent').ckeditor(); 
    }); 
</script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/ckeditor/ckeditor.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/ckeditor/adapters/jquery.js")" type="text/javascript"></script> 
<h2 class="title"> 
    <span class="text-cms">CM<span>S</span></span></h2> 
<div class="box"> 
    <div class="t"> 
    </div> 
    <div class="c"> 
     <div class="content"> 
      <div class="main-holder"> 
       <div id="sidebar"> 
        <ul> 
         <li><a href="@Url.Content("~/Cms/Index")">Home</a></li> 
         <li><a href="@Url.Content("~/Pages/Index")">Pages</a></li> 
        </ul> 
       </div> 
       <div id="content" style="min-height: 500px;"> 
        @using (Html.BeginForm()) 
        { 
         @Html.ValidationSummary(true) 
         <fieldset> 
          <legend>Page Type - @Html.DropDownListFor(x => x.PageTypeID, Model.PageTypeList) 
          @Html.ValidationMessageFor(model => model.PageTypeID)</legend> 
          <div class="editor-label"> 
           @Html.LabelFor(model => model.Title) 
          </div> 
          <div class="editor-field"> 
           @Html.EditorFor(model => model.Title, new { @class = "text-box" }) 
           @Html.ValidationMessageFor(model => model.Title) 
          </div> 
          <div class="clear"> 
          </div> 
          <div class="editor-label"> 
           @Html.LabelFor(model => model.HtmlContent) 
          </div> 
          <div class="editor-field"> 
           @Html.TextAreaFor(model => model.HtmlContent, new { @name = "Editor1", @class = "Editor1" }) 
           @Html.ValidationMessageFor(model => model.HtmlContent) 
          </div> 
          <div class="clear"> 
          </div> 


          <p> 
           <input type="submit" value="Save" class="input-btn" /> 
          </p> 
         </fieldset> 
        } 
        <div> 
         @Html.ActionLink("Back to List", "Index") 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="b"> 
    </div> 
</div>