문제

정적 항목 목록을 할당하고 싶습니다. SelectList() a Html.DropDownList() ASP.NET MVC에서 모범 사례는 무엇입니까?

나는 사용할 방법을 찾으려고 노력했다 new SelectList(new {key = "value"}... 그러나 하나는 효과가 없었고 두 사람은 내 정적 목록이 ViewData 어쨌든 IList/IENumerable?

도움이 되었습니까?

해결책 3

좋아, 나는 내 자신의 조언을하기로 결정했고, 이것은 컨트롤러에 정의되어야한다.

참고로 방금 돌아 왔습니다.

PageData data = new PageData()
           {
               Formats = new[]
                             {
                                 new { ID = "string", Name = "Text" },
                                 new { ID = "int", Name = "Numeric" },
                                 new { ID = "decimal", Name = "Decimal" },
                                 new { ID = "datetime", Name = "Date/Time" },
                                 new { ID = "timespan", Name = "Stopwatch" }
                             },
               .............

           };
return View(data);

... (컨텍스트 무시) 및보기 ASPX 측면에서 :

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"...

누군가가 더 최적의 방법을 가지고 있다면 나는 그들의 대답을 기꺼이 받아들이게 될 것입니다.

다른 팁

보기에서 SelectList를 작성하지 않는 것이 가장 좋은 방법입니다. 컨트롤러에서 생성하고 ViewData를 사용하여 전달해야합니다.

예시:

  var list = new SelectList(new []
                                          {
                                              new {ID="1",Name="name1"},
                                              new{ID="2",Name="name2"},
                                              new{ID="3",Name="name3"},
                                          },
                            "ID","Name",1);
            ViewData["list"]=list;
            return View();

생성자에게 전달 : ienumerable 객체, 값 필드 텍스트 필드 및 선택한 값.

관점에서 :

 <%=Html.DropDownList("list",ViewData["list"] as SelectList) %>

모든 MVC 멍청이는 처음에는 'M'단어를 피하지만 MVC 약어의 시작 부분에서 시작됩니다. 어쩌면 아마도 모델로 솔루션을 시작하고 싶을 수도 있습니다.

자신을 반복하지 마십시오 (건조). 옵션 목록을보기로 전달하는 모든 컨트롤러에 "new pagedata ()"를 복사하고 붙여 넣을 것입니다. 그런 다음 옵션을 삭제하거나 추가하고 모든 컨트롤러의 PAGEDATA를 편집해야합니다.

더욱이, 당신은 가장 적은 수의 장점 "add"s, "new"s, is "s 및"name "s로 최소한 양의 코드를 입력하려고합니다. 선택 옵션 (및/또는 라디오 버튼 목록)에 키 값 쌍 만 가지고 있으므로 가능한 가장 가벼운 데이터 구조 (즉, 사전)를 사용하십시오.

그런 다음 컨트롤러의 모델을 참조하고 LINQ LAMBDA 표현식을 포함하는 DropDownListfor를 사용하여 뷰에서 사전을 SELECTLIST로 변환하십시오.

협박? 당신은 혼자가 아닙니다. 나는 확실히했다. 다음은 내가 M, V 및 C를 가르치는 데 사용한 예입니다.

MVC의 모델 부분 :

using System.Web.Security;
using System.Collections.Generic;
using System.Text;
using System.Linq.Expressions;
using System.Web.Routing;
using System.Web.Helpers;
using System.Web.Mvc.Html;
using MvcHtmlHelpers;
using System.Linq;

// EzPL8.com is the company I work for, hence the namespace root. 
    // EzPL8 increases the brainwidths of waiters and bartenders by augmenting their "memories" with the identifies of customers by name and their food and drink preferences.
   // This is pedagogical example of generating a select option display for a customer's egg preference.  

namespace EzPL8.Models     
{
    public class MyEggs    
    {
        public Dictionary<int, string> Egg { get; set; }

        public MyEggs()  //constructor
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},  //show the complete egg menu to customers
                { 1, "I hate eggs"},    //Either offer an alternative to eggs or don't show eggs on a customer's personalized dynamically generated menu

                //confirm with the customer if they want their eggs cooked their usual preferred way, i.e.
                { 2, "Over Easy"},  
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };
    }
}

컨트롤러는 이제 모델을 전달하는 것만으로 매우 간단합니다. 그것은 아마도 한 페이지로 격리되지 않은 고립 된 개념을 만드는 것을 피합니다. : : : :

public ActionResult Index()
{
   var model = new EzPL8.Models.MyEggs();
   return View(model);
}

View는 드롭 다운 목록 (DropdownList 대신)과 이벤트 리팩토링에서 강력한 타이핑을위한 Lambda 표현식을 사용합니다.

@Html.DropDownListFor(m => m.Egg, new SelectList( Model.Egg, "Key", "Value"))

Voilà, 결과 HTML :

<select id="Egg" name="Egg">
<option value="0">No Preference</option>
<option value="1">I hate eggs</option>
<option value="2">Over Easy</option>
<option value="3">Sunny Side Up</option>
<option value="4">Scrambled</option>
<option value="5">Hard Boiled</option>
<option value="6">Eggs Benedict</option>
</select>

참고 : 가치에 혼란스러워하지 마십시오 <option value="6">, 이는 옵션 태그 사이에서 끝나는 텍스트/제목 (예 : Eggs Benedict) 인 SelectList ()의 "value"에서 사전의 키입니다.

유스 케이스: 응용 프로그램과 데이터베이스 간의 트래픽을 최소화하려면 변경 사항이 거의없는 드롭 다운 목록에 대한 데이터베이스 쿼리를 피하기 위해 정적 목록을 작성했습니다. 그러나 변화는 불가피하며 6 개월 동안 내 고객의 식당에서 식당이 죽습니다. 녹색 햄 때문이 아니라 알에 알레르기가 있었고 요리사는 와플과 일부를 혼합했기 때문입니다.

식당은 음식 알레르기를 즉시 포함시키기 위해 고객 정보를 업데이트해야합니다. 반복 고객을 좋아하지만 신용 카드가 취소 되었기 때문에 지불 방법이없는 좀비로 죽은 고객이 다시 돌아 오면 시원하지 않습니다.

수사적 질문 : 고객 계란 선호도와 관련된 모든 컨트롤러와 견해를 수정해야합니까? 아니면 단순히 {7, "알에 알레르기가있는"}}}}}을 모델에 삽입합니까?

또 다른 수사적 질문 : 오믈렛 계란이 아닌가? {8, "Omelette, Western"}, {9, "Omelette, Mushroom-feta-spinach"}를 추가하고 새로운 추가 기능을 사용하는 모든 드롭 다운 목록 전체에서 자동으로 전파되도록 하시겠습니까? ?

하단 라인) 이것은 아마도 당신이 요청한 것보다 더 많은 방법 일 것입니다. 그러나 당신은 VC뿐만 아니라 MVC라고 말했습니다.
1. *에서 모델을 사용하십시오.*VC. 2. 선택 목록이 "기본 키"와 제목에 지나지 않는 경우 모델에서 사전을 사용하십시오. 3. 정적 목록이 어딘가에 데이터베이스 조회 테이블로 JIVE를 사용하지 않으면 앱이 그다지 유용하지 않을 수 있습니다. 정적 목록에 옵션을 추가하면 데이터베이스의 다른 테이블과의 기본 키/외국 키 관계 무결성 오류를 피하기 위해 조회 테이블에 삽입물을 수행해야 할 가능성이 높습니다. 4. Lambda 및 강력하게 입력 된 데이터 구조를 사용하여 오류를 피하고 Typeahead 지원을받습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top