Html.DropdownListFor 선택된 값이 설정되지 않음


97

Html.DropDownListFor의 선택된 값을 어떻게 설정할 수 있습니까? 온라인에서 살펴본 결과 아래와 같이 네 번째 매개 변수를 사용하여 달성 할 수 있음을 확인했습니다.

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

내 선택 목록은 다음과 같이 표시됩니다.

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

그러나 어떤 이유로 영국이 선택된 상태로 유지되지만 "국가를 선택하십시오"를 선택하고 싶습니다.

누구든지 내가 이것을 어떻게 할 수 있는지 알고 있습니까?

편집하다

기능에 약간의 변경이 있었지만 여전히이 문제가 발생하는 것처럼 보이기 때문에 코드를 업데이트했습니다. 이것이 내 견해입니다.

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1option내가 원하는 이드의 선택, 나도 그 텍스트로 시도했지만 option작동하지 않습니다.

어떤 아이디어?

답변:


182

코드에는 몇 가지 개념적 문제가 있습니다.

첫째 ,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

DropDownListFor를 사용할 때 첫 번째 매개 변수는 양식을 제출 한 후 선택한 값이 저장되는 속성입니다. 따라서 귀하의 경우 SelectedOrderId다음과 같이 사용하려면 모델의 일부 또는 이와 유사한 것을 가져야합니다 .

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

둘째 ,

ViewBag를 사용하는 것 외에는 잘못된 것은 아니지만 더 나은 방법이 있습니다 (대신 ViewModel에 해당 정보를 넣음). SelectList를 보유하고있는 ViewBag 속성이 선택한 값 을 입력속성의 이름과 동일 합니다. 이를 방지하려면 항목 목록을 포함하는 속성의 이름을 지정할 때 다른 이름을 사용하십시오.

이 문제를 피하고 더 나은 MVC 코드를 작성하려면 내가 사용할 코드 :

뷰 모델 :

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}

제어 장치:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}

보기에서 :

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")

43
나의 하루 저장 : "... SelectList를 보유하고있는 ViewBag 속성이 선택한 값을 입력 한 속성의 이름과 같을 때 약간의 버그가 있습니다.이를 방지하려면 속성 보유의 이름을 지정할 때 다른 이름을 사용하십시오. 항목 목록. " 감사합니다!
마이클 A. VOLZ 일명 플린

4
이 "작은 버그"는 절대적인 광기입니다! 이 때문에 내 인생의 2 시간을 낭비했습니다. 어떻게 그렇게 명백한 것이 여전히 존재하고 패치되지 않을 수 있습니까?
cen

1
플린, 귀하의 의견은 실제로 답변이어야합니다. 나는 일에 나의 드롭 다운리스트를 얻기 위해 미친 구현을 시도하고 이것은 간단한 해결책이었다
드웨인 Hinterlang에게

2
약간의 버그가 있습니까? 전혀 버그가 아닙니다. 모델 바인딩은 속성 값에 OrderTemplates바인딩하고 ViewBagtypeof 속성 에 바인딩하려는 시도에 바인딩 할 때 작동 합니다 IEnumerabe<SelectListItem>. 그러나 <select>요소는 복잡한 개체의 컬렉션에 바인딩 할 수 없습니다 (값 유형 만 해당)

이 대답이 아니었다면 하루 종일 낭비했을 것입니다. 진지하게 그 작은 버그가 우리가 viewbag에서 ​​보석금을 내야하는 이유입니다
Worthy7

22

나를 위해 일하지 않았으므로 이렇게 일했습니다.

제어 장치:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

전망:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

JQuery :

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});

2
컨트롤러에 잘못된 괄호 수가 있습니다. 하나의 여는 괄호와 두 개의 닫는 괄호가 있습니다.
Amos Long

7

다음과 같은 객체를 전달할 때 :

new SelectList(Model, "Code", "Name", 0)

소스 ( Model) 및 키 ( "Code") 텍스트 ( "Name") 및 선택한 값 0. 속성 0에 대한 소스에 값 이 없을 수 Code있으므로 HTML 도우미는 첫 번째 요소를 선택하여 실제 selectedValue를이 컨트롤에 전달합니다.


3

할당하기 전에 선택한 값을 잘라 냈는지 확인하십시오.

//모델

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

//제어 장치

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//전망

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })

2

뷰에 무엇이 있을지 알고 있다면 컨트롤러에서 기본값을 설정 한 다음 view / cshtml 파일에 설정할 수도 있습니다. HTML 측에서 기본값을 설정할 필요가 없습니다.

컨트롤러 파일에서.

commission.TypeofCommission = 1;
return View(commission);

.cshtml 파일에서.

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")

1

수업을 잊어야합니다

선택 목록

컨트롤러 에서 이것을 사용하십시오 .

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

값을 선택하십시오.

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

ViewData에 목록을 추가합니다.

ViewBag.CustomerTypes = customerTypes;

보기 에서 사용 :

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

자세한 정보 : http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc



0

나에게 일반적인 솔루션 :)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}

0

빈 항목, 선택한 항목이있는 드롭 다운 Linq (100 % 작동)
(강력하게 입력 됨, 오류 가능성 최소화) 모든 모델 변경 사항이 바인딩에 반영됩니다.

제어 장치

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

전망

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

데이터를 바인딩하는이 방법도 가능합니다.

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });

var selList = CompTypeList.Select (s => new SelectListItem {Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString (), Selected = s.CompTyp_Id == 3? true : false});

0

나는 이것이 실제로 질문에 대한 대답이 아니라는 것을 알고 있지만이 게시물을 계속해서 걸렸을 때 뷰에서 즉시 목록에서 DropDownList를 초기화하는 방법을 찾고있었습니다.

내 실수는 다음과 같이 사전에서 SelectList를 만들려고 시도한 것입니다.

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

그런 다음 공식 msdn 문서를 파헤쳐 보았는데DropDownListFor 반드시 a가 필요하지는 않지만 다음이 필요 하다는 것을 알았 SelectList습니다 IEnumerable<SelectListItem>.

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

제 경우에는 Model.Localitya) 유일한 항목이고 b) 이미 SelectListItem.Selected속성에 해당 항목 이 표시 되어 있으므로 선택한 항목을 생략 할 수도 있습니다 .

궁금한 점이있는 경우 데이터 소스는 SelectWoo / Select2 컨트롤을 사용하여 동적으로로드되는 AJAX 페이지입니다.


0
public byte UserType
public string SelectUserType

당신은 하나를 얻고 다른 것을 설정해야합니다. 선택한 값은 설정하려는 항목과 같을 수 없습니다.

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

내 목록에 Enum 사전을 사용하기 때문에 "키", "값"쌍이 있습니다.


0

비슷한 문제가 발생하여 ViewBag 및 Element 이름을 동일하게 사용했습니다. (타이핑 실수)


0

이것은 CSS 문제입니다. Bootstrap 4의 @ Html.DropDownListFor가 작동하지 않는 이유를 모르겠습니다. 확실히 이것은 클래스 디자인 문제입니다. 어쨌든 드롭 다운 입력 상자에 CSS 패딩이있는 경우 해결 방법은 다음과 같습니다. #px, # px; 요소를 비활성화합니다. 이것이 효과가 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.